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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Java-通过工厂、Map容器创建对象

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

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

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

相关文章
|
4天前
|
存储 Java 编译器
【Java开发指南 | 第八篇】Java变量、构造方法、创建对象
【Java开发指南 | 第八篇】Java变量、构造方法、创建对象
16 3
|
4天前
|
安全 Java 编译器
java中类与对象回顾总结-2
java中类与对象回顾总结
18 3
|
4天前
|
Java 编译器
java中类与对象回顾总结-1
java中类与对象回顾总结
14 3
|
1天前
|
安全 Java 容器
Java一分钟之-并发编程:并发容器(ConcurrentHashMap, CopyOnWriteArrayList)
【5月更文挑战第18天】本文探讨了Java并发编程中的`ConcurrentHashMap`和`CopyOnWriteArrayList`,两者为多线程数据共享提供高效、线程安全的解决方案。`ConcurrentHashMap`采用分段锁策略,而`CopyOnWriteArrayList`适合读多写少的场景。注意,`ConcurrentHashMap`的`forEach`需避免手动同步,且并发修改时可能导致`ConcurrentModificationException`。`CopyOnWriteArrayList`在写操作时会复制数组。理解和正确使用这些特性是优化并发性能的关键。
7 1
|
2天前
|
数据采集 监控 安全
java数字工厂MES系统全套源码Java+idea+springboot专业为企业提供智能制造MES解决方案
"MES" 指的是制造执行系统(Manufacturing Execution System)。MES在制造业中扮演着至关重要的角色,它是位于企业资源计划(ERP)系统和车间控制系统之间的系统,用于实时收集、管理、分析和报告与制造过程相关的数据。
9 0
|
2天前
|
移动开发 监控 供应链
JAVA智慧工厂制造生产管理MES系统,全套源码,多端展示(app、小程序、H5、台后管理端)
一开始接触MES系统,很多人会和博主一样,对MES细节的应用不了解,这样很正常,因为MES系统相对于其他系统来讲应用比较多!
14 1
JAVA智慧工厂制造生产管理MES系统,全套源码,多端展示(app、小程序、H5、台后管理端)
|
3天前
|
消息中间件 Java RocketMQ
MQ产品使用合集之在同一个 Java 进程内建立三个消费对象并设置三个消费者组订阅同一主题和标签的情况下,是否会发生其中一个消费者组无法接收到消息的现象
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
10 1
|
4天前
|
Kubernetes 网络协议 Java
容器服务Kubernetes版产品使用合集之遇到报错"java.lang.NoClassDefFoundError"如何解决
容器服务Kubernetes版,作为阿里云提供的核心服务之一,旨在帮助企业及开发者高效管理和运行Kubernetes集群,实现应用的容器化与微服务化。以下是关于使用这些服务的一些建议和合集,涵盖基本操作、最佳实践、以及一些高级功能的使用方法。
17 2
|
4天前
|
Java 编译器
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
11 4
|
4天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
23 4