Spring源码阅读(二)—IOC容器初始化
IOC控制反转是指在传统面向对象的系统中,合作对象的创建和管理由具体的业务对象完成,而如果能够把控制权从具体的对象转交给平台或者框架中,可以极大的降低面向对象系统设计复杂性,这种对象依赖关系控制权的转移就成为控制反转.
IOC容器的初始化(Bean载入)和容器依赖注入是两个相对独立的过程,容器的初始化只是将XML配置文件中Bean的信息装载到承载类BeanDefinition中不处理具体的依赖注入.
个人主页:tuzhenyu’s page
原文地址:Spring源码阅读(二)—IOC容器初始化
初始化原始容器主要是指通过对XML配置文件进行解析,将解析处理出来的bean装载到容器中。初始化主要包括以下四步:
读入XML资源文件
从资源文件中获取Document对象
解析Document创建BeanDefination实例
注册BeanDefinations
(一) 容器的初始化入口
- ApplicationContext实现容器的初始化,ApplicationContext实现容器的初始化是调用BeanFactory。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- XMLBeanFactory实现容器的初始化,XMLBeanFactory实现容器初始化的原理是调用DefaultListableBeanFactory类和
XmlBeanDefinitionReader类。
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
DefaultListableBeanFactory实现容器的初始化
读入XML配置文件,创建IOC配置资源。
创建一个BeanFactory,这里使用DefaultListableBeanFactory进行实例化。
创建一个载入BeanDefinition的读取器,绑定BeanFactory实力。
将XML配置文件解析成一个一个Bean的承载类BeanDefinition,并注册进BeanFactory。
Resource resource = new ClassPathResource("applicationContext.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);
(二) 读入XML资源文件
- 将Resource通过EncodedSource类进行封装,放回EncodedSource对象实例。目的是考虑到Resource随中可能存在编码要求的情况。
public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
return this.loadBeanDefinitions(new EncodedResource(resource));
}
- 将EncodedSource对象实例抽取InputStream封装进InputSource类对象中,调用doLoadBeanDefinitions()方法开始解析。
public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
Assert.notNull(encodedResource,