zoukankan      html  css  js  c++  java
  • XmlFactoryBean和DefaultListableBeanFactory学习

    首先提供了一个Spring容器最简单的例子。

    bean的定义,MyTestBean.java

    public class MyTestBean {
        private String testStr = "testStr";
        
        public String getTestStr() {
            return testStr;
        }
        
        public void setTestStr() {
            this.testStr = testStr;
        }
    }

    配置文件的定义,beanFactoryTest.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.Springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.Springframework.org/schema/beans
                               http://www.Springframework.org/schema/beans/Spring-beans.xsd">
                               
        <bean id="myTestBean" class="bean.MyTestBean" />
        
    </beans>

    测试代码,BeanFactoryTest.java

    @SuppressWarnings("deprecation")
    public class BeanFactoryTest {
        @Test
        public void testSimpleLoad() {
            BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml");
            MyTestBean bean = (MyTestBean) bf.getBean("myTestBean");
            assertEquals("testStr", bean.getTestStr());
        }
    }

    那么在这个测试中有一个关键的类就是现在要学习一下的XmlBeanFactory。

    这段测试代码完成的功能无非一下几点:

    (1)读取配置文件beanFactoryTest.xml

    (2)根据beanFactoryTest.xml中的配置找到对应的类的配置,并实例化。

    (3)调用实例化后的实例。

    public class XmlBeanFactory extends DefaultListableBeanFactory {
        private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
    
        /**
         * 根据给定的可以用DOM进行解析的resource创建一个新的XmlBeanFactory
         * @param 代表resource的XML资源, 用来加载bean的定义
         * @throws 一旦有加载或者解析异常即抛出BeansException异常
         */
        public XmlBeanFactory(Resource resource) throws BeansException {
            this(resource, null);
        }
    
        /**
         * 用给定的可用DOM解析的输入流创建一个新的XmlBeanFactory
         * @param 代表resource的XML资源, 用来加载bean的定义
         * @param parentBeanFactory 父bean工厂
         * @throws 一旦有加载或者解析异常即抛出BeansException异常
         */
        public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
            super(parentBeanFactory);
            this.reader.loadBeanDefinitions(resource);
        }
    }

    上面就是XmlBeanFactory.java的源码了,看上去也非常简单。

    值得学习的是:

    (1)用了两个构造函数,在一个中调用了另一个,实现了不同的逻辑

    (2)Spring中有父子容器,这个点我还没有弄懂

    image

    类图结构就是这样的。

    然后时序图是这样的:

    image

    跟之前说的一样,先是加载类资源:new ClassPathResource("beanFactoryTest.xml"),后续的资源处理就可以用Resource提供各种服务来操作了。

    然后利用XmlBeanDefinitionReader读取bean的定义,最后实例化一个容器出来。

    下一节会学习配置文件的封装,也就是从读取xml配置文件到内存中成为Resource的过程。

    之前也有写过这方面的学习过程,但是写的东西太杂了,又没有回头巩固,感觉忘得很快。

  • 相关阅读:
    13.Convert BST to Greater Tree(将树转为更大树)
    13.调用数组顺序使奇数位于偶数前面
    12.数值的整数次方
    11.二进制中1的个数
    12.Hamming Distance(汉明距离)
    11.Find All Numbers Disappeared in an Array(找出数组中缺失的数)
    10.Find All Anagrams in a String(在一个字符串中发现所有的目标串排列)
    垃圾收集器与内存分配策略---垃圾收集器
    线程之间的协作
    1287. Mars Canals(DP)
  • 原文地址:https://www.cnblogs.com/tuhooo/p/8908918.html
Copyright © 2011-2022 走看看