Java-通过工厂、Map容器创建对象

 

Java-通过工厂、Map容器创建对象

通过工厂+反射+配置文件创建对象

通过工厂+反射+配置文件获取对象

配置文件如下

通过Map容器间接获取对象

通过Map容器间接获取对象,与Spring中的IOC容器类似,采用立即加载策略

配置文件内容如下


一、通过工厂+反射+配置文件创建对象

通过工厂+反射+配置文件获取对象

/**
 * @Author: Promsing
 * @Date: 2021/3/7 - 10:09
 * @Description: 通过使用工厂+配置文件+反射实现创建对象
 * @version: 1.0
 */
public class AbsFactory {

    //声明一个变量(多例模式,每次通过工厂都会创建一个不同的实例)
    private static Object obj;

    public static Object createType(String createName){
        //自动释放资源--使用绝对路径
        try( InputStream is =new FileInputStream("src\\Factory.properties")) {
           //配置文件类
            Properties pro=new Properties();
            pro.load(is);
           // System.out.println(pro.size());
            //获取参数
            String property = pro.getProperty(createName);
            obj = Class.forName(property).newInstance();
         
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            return  obj;
        }
    }

}

配置文件如下

//以Key,Value的形式,主要Value要写全类名,不要加分号
accountService=com.dynamic.service.Impl.AccountServiceImpl
accountDao=com.dynamic.dao.Impl.AccountDaoImpl

二、通过Map容器间接获取对象

通过Map容器间接获取对象,与Spring中的IOC容器类似,采用立即加载策略

/**
 * @Author: Promsing
 * @Date: 2021/3/19 - 11:50
 * @Description: 模仿IOC容器,将创建的对象放在Map集合中,加载该类时会读取配置文件中,将类放入Map中
 * @version: 1.0
 */
public class BeanFactory {
    //定义一个properties对象
    private static Properties props;
    //定义一个Map,用于存放我们创建的对象(单例,当类加载之后就有了对象,之后从Map中获取)
    private static Map<String,Object> beans;

    //容器
    static {
        try {
            props=new Properties();
            //将bean.properties放在了resources路径下
            InputStream is=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            props.load(is);
            //实例化容器
            beans=new HashMap<String,Object>();
            //从配置文件中获取所有key值
            Enumeration<Object> keys = props.keys();
            while (keys.hasMoreElements()){
                //取出每一个key
                String key = keys.nextElement().toString();
                //根据key获取value
                String path = props.getProperty(key);
                Object value=Class.forName(path).newInstance();
                //放入容器中
                beans.put(key,value);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    //提供一个访问Map容器的入口
    public static Object  getInstance(String name){
        return beans.get(name);
    }

}

配置文件内容如下

accountService=com.dynamic.service.Impl.AccountServiceImpl
accountDao=com.dynamic.dao.Impl.AccountDaoImpl

以上两部分归到根上都是通过反射创建对象,JDK8在反射创建对象时,做了很大的增强,提高了性能。其实Spring IOC与以上实现创建对象的原理是一致的,Spring IOC做的就是这件事情,只是它封装的更好而已(当然还有其他的增强,O(∩_∩)O哈哈~)。

如果本篇博客对您有一定的帮助,大家记得留言+点赞哦。

  • 47
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 55
    评论
Java编程中的容器工厂和静态代码块可以一起使用,实现在应用程序启动时完成对象创建和初始化。 容器工厂是一种软件工具,用于自动化地创建和管理对象容器工厂通常包括一个构建工具,用于创建、打包和部署对象,以及一个编排工具,用于管理和协调对象的运行。通过使用容器工厂,开发人员可以更快速、更方便地构建、测试和部署应用程序,从而提高开发、测试和部署的效率。 静态代码块是一个特殊的代码块,在类加载时执行,用于初始化类的静态成员变量和静态方法。静态代码块的执行顺序是在类加载时,按照出现的顺序依次执行。 在Java编程中,我们可以在静态代码块中使用容器工厂,实现在应用程序启动时完成对象创建和初始化。具体来说,我们可以在静态代码块中读取配置文件中的属性,然后将属性值转换为对应的对象,并将对象放入Map中。在使用容器工厂时,调用getBean方法,传入对象的名称,即可获取对应的对象。 示例代码如下: ```java import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class ContainerFactory { private static Map<String, Object> container = new HashMap<>(); static { Properties props = new Properties(); InputStream in = null; try { in = ContainerFactory.class.getClassLoader().getResourceAsStream("config.properties"); props.load(in); for (Object key : props.keySet()) { String className = props.getProperty(key.toString()); Class<?> clazz = Class.forName(className); container.put(key.toString(), clazz.newInstance()); } } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static Object getBean(String name) { return container.get(name); } } ``` 在上面的代码中,我们将容器工厂实现为一个静态类,并在静态代码块中读取配置文件config.properties中的属性,并将属性值转换为对应的对象,并将对象放入一个Map中。在使用容器工厂时,调用getBean方法,传入对象的名称,即可获取对应的对象。这样,在应用程序启动时,就可以完成对象创建和初始化,提高应用程序的性能和响应速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小张自由—>张有博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值