Spring源码分析一

来源:互联网 发布:阿里云 混合云 编辑:程序博客网 时间:2024/05/22 00:51

容器的基本实现原理

一、功能分析
a、读取配置文件BeanXmlTest.xml
b、根据beanfactoryTest.xml中的配置找到对应bean的位置,并实例化
c、调用实例化后的实例
这里写图片描述
容器的实现就如上图那么简单吗?
二、核心类介绍
1、DefaultListableBeanFactory
XmlBeanFactory继承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整个bean加载的核心部分。
XmlBeanFactory和DefaultListableBeanFactory不同之处
a 、XmlBeanFactory使用了XML读取器XmlBeanDefinitionReader,实现了个性化BeanDefinitionReader;
b、DefaultListableBeanFactory extends AbstractAutowire CapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry;
2、XmlBeanDefinitionReader
XmlBeanDefinitionReader实现了资源文件的读取、解析、注册
a、通过XmlBeanDefinitionReader extends AbstractBeanDefinitionReader来使用resourceLoader,将资源文件转换成对应的Source文件
b、通过documentLoader对resource文件进行转换,将resource文件转换成document文件
c、通过DefaultBeanDefinitionDocumentReader implements BeanDefinitionDocumentReader,使用 doRegisterBeanDefinitions(Element root) 将document文件转换成element文件
三、容器的基础XmlBeanFactory
这里写图片描述
这里将不同的URL资源文件,经过一些处理最后都转换成了resource文件
在Resource类中:
这里写图片描述
Resource extends InputStreamSource
这里提供了一些接口,存在性、可读性、可打开性、getDescription用于在错误处理中的打印信息
这里写图片描述
这里有两个方面
1、上方的this.reader.loadBeanDefinitions(resource)才是真正的加载resource文件,前面提到的XmlBeanDefinitionReader也是在这里完成的
**2、**super(parentBeanFactory);加载数据之前还调用了一个父类的方法
这里写图片描述
ignoreDependencyInterface的功能是忽略给定接口的自动装配功能
四、加载Bean
我们从this.reader.loadBeanDefinitions(resource)开始
这里写图片描述
这里写图片描述
从上面步骤看到三部曲:
1、获取xml文件的验证模式
2、加载xml文件,获取resource,document文件
3、根据document文件的信息注册bean
这里写图片描述
五、解析并注册BeanDefinition
这里写图片描述
从上面的代码来看,在spring里面有两大类bean声明,一个是默认的如

<bean id="test" class="test.Testbean" />

另一类是自定义的,如:

<tx:annotation=driven/>

这两中解析bean的方法差别还是很大,如果采用第一中默认配置,spring当然知道该怎么做,但是第二种的话,需要用户提供一些接口和配置