专栏名称: 小小张自由—>张有博
目录
相关文章推荐
华龙网  ·  哇~DeepSeek,你是懂重庆的! ·  12 小时前  
华龙网  ·  哇~DeepSeek,你是懂重庆的! ·  12 小时前  
重庆市文化和旅游发展委员会  ·  今年春节泼天的流量,重庆接住了! ·  昨天  
重庆市文化和旅游发展委员会  ·  今年春节泼天的流量,重庆接住了! ·  昨天  
重庆日报  ·  重庆楼市迎来“开门红”! ·  2 天前  
重庆日报  ·  重庆楼市迎来“开门红”! ·  2 天前  
重庆日报  ·  创意视频|新春第一会 绘出新重庆新篇章 ·  2 天前  
重庆日报  ·  创意视频|新春第一会 绘出新重庆新篇章 ·  2 天前  
51好读  ›  专栏  ›  小小张自由—>张有博

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

小小张自由—>张有博  · CSDN  ·  · 2021-03-28 10:15

正文

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哈哈~)。







请到「今天看啥」查看全文


推荐文章
华龙网  ·  哇~DeepSeek,你是懂重庆的!
12 小时前
华龙网  ·  哇~DeepSeek,你是懂重庆的!
12 小时前
重庆市文化和旅游发展委员会  ·  今年春节泼天的流量,重庆接住了!
昨天
重庆市文化和旅游发展委员会  ·  今年春节泼天的流量,重庆接住了!
昨天
重庆日报  ·  重庆楼市迎来“开门红”!
2 天前
重庆日报  ·  重庆楼市迎来“开门红”!
2 天前
大爱狗狗控  ·  养了个狗,感觉自己像是...当了个妈...
7 年前
医学界麻醉频道  ·  手术前刮毛,你还在做吗?
7 年前
互联网那些事  ·  让马云千里追寻的80后美女富豪
7 年前
圣贤教育改变命运  ·  【好书推荐】《弟子规与幸福人生》 秦东魁著
7 年前