首页 > 其他分享 >容器工厂

容器工厂

时间:2023-06-01 16:22:59浏览次数:37  
标签:容器 反射 spring 创建对象 工厂 key new

一、通过工厂+反射+配置文件创建对象
简单的说就是以后我们不用自己new对象了,对象的实例化都交给工厂来完成,我们需要对象的时候直接问工厂拿一个就行,一会我们会来看一个例子。在这里有一点要说明,spring IOC与工厂模式并不是完全相同的,最大的不同在于普通的工厂模式内部还是使用new来创建对象,但是spring IOC是用反射来创建对象,这么做有什么好处呢?

/**
 * @author wangl
 * @date 2023/5/31
 * 容器工厂
 */
public class ContainerFactory {

    /**
     * 容器
     */
    private static Map<String, Object> container = new HashMap<>();

    /**
     * 在静态代码块中初始化整个容器工厂,解析properties文件中配置的对象,
     * 创建实例放入到Map集合中
     */
    static {
        //加载配置文件
        //1、创建Propertise对象
        Properties prop = new Properties();
        //根据Properties文件的位置创建一个输入流,给Properties对象进行操作
        //InputStream 输入流-用完就关闭
        //getClassLoader:类加载器
        //getResourceAsStream 找到项目的src目录
        try (InputStream input = ContainerFactory.class.getClassLoader().getResourceAsStream("Bean.properties")){


            //加载并读取properties文件的内容
            prop.load(input);

            //循环遍历prop对象得到每一个properties
            //把创建好的实例Map集合中key
            //map.put(key,input)
            prop.forEach((key,value) -> {
                //key.toString(),newInstance()))
                Object instance = newInstance(value.toString());
                container.put(key.toString(),instance);
                    });

//

        } catch (Exception e) {
            throw new RuntimeException("解析失败",e);
        }
    }

        private static  Object newInstance(String className) {
            try {
                //通过完成整类名加载class对象
                Class<?>clazz = Class.forName(className);
                return clazz.getConstructor().newInstance();
            }catch (Exception e){
                throw new RuntimeException("解释失败");
            }
        }
    /**
     * 容器工厂方法
     */
    public static <T> T getBean(String name) {
        return (T)container.get(name);
    }


}

配置文件如下

iphone = edu.nf.product.IPhone
miphone = edu.nf.product.MiPhone

spring IOC的思想与工厂模式基本是一样的,只是创建对象的方式从“new”变成了反射,这就带来了很大的灵活性。不过,现在阅读spring源码还为时过早,于是我自己写了一个简单的例子来模拟spring IOC的基本原理。
首先,如果我们要用反射创建对象,全类名是必不可少的(反射不太记得的朋友请好好复习一下反射),然后我们还需要一个类名,用来告诉工厂我们需要哪个对象(就像上面getShape方法传入的参数shapeType一样),这个名字可以随便取,但是不能重复。这样我们就有了创建对象的两个要素,然后我们需要一个key-value对把这两个关联起来。然后就形成了这样一个模式:我们传入类名,工厂去查询key-value对,找到对应的全类名,然后通过全类名利用反射创建对象,再返回给我们。是不是很简单呢?

标签:容器,反射,spring,创建对象,工厂,key,new
From: https://www.cnblogs.com/s186/p/17449399.html

相关文章

  • 工厂方法
    工厂方法模式(定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行) 工厂方法模式是对简单工厂模式的进一步抽象化,可以使系统在不修改原来代码的情况下引进新的产品,满足开闭原则。优点:1、用户只需要知道具体工厂的名称就可得到所要的产......
  • 抽象工厂
    抽象工厂打破了工厂类和产品类(大类例如:手机、平板)这种一对一的关系。一个具体的工厂类可以产生多个大类的产品以往的工厂类不在只能生产单一的产品类了,例如:广东工厂可以生产手机以及口罩,手机厂不仅仅能生产小米手机还可以生产一加手机了代码示例......
  • 小程序容器助力航空企业数字化转型
    数字化时代,越来越多的企业开始关注数字技术,希望通过数字化改造提高企业效率和竞争力,为企业创造更多的商机和利润。今天就来同大家探讨航空领域,小程序在企业数字化转型中发挥的作用。航空业员工端App的敏捷转型挑战技术上的挑战:多平台兼容性: 航空公司的员工使用不同的设备和操作系......
  • 小程序容器助力航空企业数字化转型
    数字化时代,越来越多的企业开始关注数字技术,希望通过数字化改造提高企业效率和竞争力,为企业创造更多的商机和利润。今天就来同大家探讨航空领域,小程序在企业数字化转型中发挥的作用。航空业员工端App的敏捷转型挑战技术上的挑战:多平台兼容性: 航空公司的员工使用不同的设备和操......
  • K8s Pod状态与容器探针
    1、pod的调度流程及常见状态1.1、pod的调度流程Pod创建过程如上图所示,首先用户向apiserver发送创建pod的请求,apiserver收到用于创建pod请求后,对应会对该用户身份信息进行验证,该用户是否是合法的用户,是否具有创建pod的权限,如果能够通过apiserver的验证,则进行下一步,对用户提交的......
  • 新型探索:React Native与小程序容器技术的结合
    ReactNative是由Facebook开发并于2015年首次发布的一个框架,用于构建原始的移动应用程序。它具有许多技术上的优势:跨平台开发:使用ReactNative,您可以使用相同的代码库构建同时运行在iOS和Android平台上的应用程序。这种跨平台的开发方式可以大大减少开发工作量和时间成本,因为您不需......
  • 小程序容器助力构建新型超级App软件应用架构
    所谓软件架构,就是软件系统的骨骼与框架。近年来,软件及开源技术迅猛发展,软件应用架构的概念也愈加普遍。它提供了一种组织和设计软件系统的有效方法,具有许多优势和好处:模块化和可维护性:软件应用架构将系统拆分为模块化的组件,每个组件负责特定的功能或任务。这种模块化的设计使得系统......
  • kubernetes(k8s)大白学习02:容器和docker基础、使用、架构学习
    一、什么是容器容器简介简单说:容器(container)就是计算机上的一个沙盒进程,它与计算机上的所有其它进程相隔离。这种隔离是怎么做到的呢?它利用了内核提供的namespace和cgroup这2种技术。这些技术能力在Linux中已经存在了很长时间。而Docker或容器技术致力于将这些功能更......
  • ThreadLocal 详解【并发容器】
    ThreadLocal是什么?有哪些使用场景?ThreadLocal是一个本地线程副本变量工具类,在每个线程中都创建了一个ThreadLocalMap对象,简单说ThreadLocal就是一种以空间换时间的做法,每个线程可以访问自己内部ThreadLocalMap对象内的value。通过这种方式,避免资源在多线程间共享。原理:......
  • React Native+小程序容器=更高的开发效率
    ReactNative是由Facebook开发并于2015年首次发布的一个框架,用于构建原始的移动应用程序。它具有许多技术上的优势:跨平台开发:使用ReactNative,您可以使用相同的代码库构建同时运行在iOS和Android平台上的应用程序。这种跨平台的开发方式可以大大减少开发工作量和时间成本,因为......