首先提供了一个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中有父子容器,这个点我还没有弄懂
类图结构就是这样的。
然后时序图是这样的:
跟之前说的一样,先是加载类资源:new ClassPathResource("beanFactoryTest.xml"),后续的资源处理就可以用Resource提供各种服务来操作了。
然后利用XmlBeanDefinitionReader读取bean的定义,最后实例化一个容器出来。
下一节会学习配置文件的封装,也就是从读取xml配置文件到内存中成为Resource的过程。
之前也有写过这方面的学习过程,但是写的东西太杂了,又没有回头巩固,感觉忘得很快。