Spring之IOC容器的实现

    xiaoxiao2021-03-25  171

    控制反转:如果合作对象的引用或依赖关系的管理由具体对象来完成,会造成代码的高耦合和可测试性的降低。所以这些依赖关系可以通过把对象的依赖注入交给框架或IOC容器来完成。

    IOC容器是实现控制依赖反转模式的一种载体,它可以在对象生成或初始化的时候直接将数据注入到对象中,或者可以通过将对象引用注入到对象数据域中的方式来注入对方调用的依赖。这种依赖是可以递归的,对象被逐层注入。IOC容器把对象的依赖关系有序的简历起来,简化了对象依赖关系的管理。

    IOC容器的设计有主要由两种系列:实现BeanFactory接口的简单容器系列和ApplicationContext。ApplicationContext是容器的高级形态,在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境作了许多适配。

    BeanFactory为具体实现IOC容器指定基本的规范功能。

    public interface BeanFactory { // 这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象, // 如果需要得到工厂本身,需要转义 String FACTORY_BEAN_PREFIX = "&"; // 这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。 Object getBean(String name) throws BeansException; // 这里根据bean的名字和Class类型来得到bean实例,和上面的方法不同在于它会抛出异常:如果根据名字取得的bean实例的Class类型和需要的不同的话。 Object getBean(String name, Class requiredType) throws BeansException; // 这里提供对bean的检索,看看是否在IOC容器有这个名字的bean boolean containsBean(String name); // 这里根据bean名字得到bean实例,并同时判断这个bean是不是单件 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; // 这里对得到bean实例的Class类型 Class getType(String name) throws NoSuchBeanDefinitionException; // 这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来 String[] getAliases(String name); }

    //获取资源位置 ClassPathResource cp = new ClassPathResource("test.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); //XmlBeanDefinitionReader负责解析配置文件 XmlBeanDefinitionReader xbr = new XmlBeanDefinitionReader(factory); //读取定义好的资源位置 xbr.loadBeanDefinitions(cp);

    IOC容器的初始化:

    BeanDefinition的载入和解析:

    对IOC容器来说,这个载入过程相当于把定义的BeanDefinition在IoC容器中转化为一个Spring内部表示的数据结构的过程。

    //这里调用容器的refresh,是载入BeanDefinition的入口 if (refresh) { refresh(); }

    BeanDefinition的载入是分为两个部分:

    利用DOM获取Bean的Document对象利用documentReader将得到的document对象按照Spring的Bean规则进行解析。

    Spring是利用DOM方式解析XML的。

    (1)得到 DOM 解析器的工厂实例      

    DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();

    (2) DOM 工厂获得 DOM 解析器

     DocumentBuilder dombuilder=domfac.newDocumentBuilder();

    (3)把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它

    InputStream is= new  FileInputStream("test1.xml");        

    ( 4 )解析 XML 文档的输入流,得到一个 Document

     Document doc=dombuilder.parse(is);

    ( 5 )得到 XML 文档的根节点

    Element root=doc.getDocumentElement();

    ( 6 )得到节点的子节点

      NodeList books=root.getChildNodes();

    转载请注明原文地址: https://ju.6miu.com/read-2833.html

    最新回复(0)