1.Spring源码下载
spring-framework
本地运行需要安装gradle,个人经验,需要idea版本高一点,如果idea版本比较低,gradle使用会报错。我使用idea2019.2
2.Spring小例子
2.1.先自定义一个bean
public class MyTestBean {
private static Log log= LogFactory.getLog(MyTestBean.class);
private String testStr="test";
public String getTestStr() {
return testStr;
}
public void setTestStr(String testStr) {
this.testStr = testStr;
}
public void destroy(){
log.info("destroy");
}
}
2.2.增加配置文件
<bean id="myTestBean" class="org.springframework.beans.factory.xml.MyTestBean" destroy-method="destroy"/>
2.3. 测试
@Test
public void testSimpleLoad(){
BeanFactory bf=new XmlBeanFactory(new ClassPathResource("org/springframework/beans/factory/xml/beanFactoryTest.xml"));
MyTestBean bean=(MyTestBean)bf.getBean("myTestBean");
assertThat("test").isEqualTo(bean.getTestStr());
}
2.4 测试结果
10:20:39.450 [Test worker] DEBUG o.s.b.f.x.XmlBeanDefinitionReader - Loaded 2 bean definitions from class path resource [org/springframework/beans/factory/xml/beanFactoryTest.xml]
10:20:39.485 [Test worker] DEBUG o.s.b.f.x.XmlBeanFactory - Creating shared instance of singleton bean 'myTestBean'
BUILD SUCCESSFUL in 2m 7s
94 actionable tasks: 16 executed, 78 up-to-date
10:20:40: Tasks execution finished ':integration-tests:cleanTest :integration-tests:test --tests "org.springframework.beans.factory.xml.BeanFactoryTest.testSimpleLoad"'.
3.容器的基本实现
3.1 容器的基本组成部分
从2章节的小例子可以看出,Spring主要分为以下几部分
(1)读取配置文件;
(2)根据配置文件招待对应的类的配置,并实例化;
(3)调用实例化的实例。
3.2核心类
(1) DefaultListableBeanFactory
该类主要作用是注册或者获取bean,XmlBeanFactory 在DefaultListableBeanFactory的基础上增加了 reader属性,主要用于从xml文档中读取BeanDefinition
(2) XmlBeanDefinitionReader
xml配置文件读取是spring的重要功能,可以从此类中梳理出资源文件读取,解析和注册的大致脉络
a. 通过继承AbstractBeanDefinitionReader使用ResourceLoader将资源文件路径转换为对应的Resource文件;
b.通过DocumentLoader对Resouce文件急性转换,将Resouce文件转换为Document文件;
c.通过DefaultBeanDefinitionDocumentReader对Document进行解析,并使用BeanDefinitionParserDelegate对Element进行解析。