介绍
在AbstractApplicationContext类的refresh方法中,有一行ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();它的作用就是创建bean工厂。详细的说做了三件事
- 创建bean工厂,工厂实例是DefaultListableBeanFactory;
- 定制化工厂属性;
- 加载定义bean的xml文件,扫描被注解@component标注的类,将其解析为bean definition并加载到bean 工厂里;
时序图
方法调用链
- obtainFreshBeanFactory
// 创建bean工厂
refreshBeanFactory();
// 获取创建的bean工厂
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
- refreshBeanFactory
// 创建bean工厂实例,创建的方法是直接new的实例
DefaultListableBeanFactory beanFactory = createBeanFactory();
// 定制化bean工厂属性
customizeBeanFactory(beanFactory);
// 解析并加载xml文件
loadBeanDefinitions(beanFactory);
- customizeBeanFactory
// 设置该bean工厂管理的bean definition是否允许被覆写
beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
// 设置该bean工厂管理的bean是否允许循环引用
beanFactory.setAllowCircularReferences(this.allowCircularReferences);
- loadBeanDefinitions
// 创建一个xml读取器
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
// 获取web.xml里配置的configLocation参数
String[] configLocations = getConfigLocations();
// for循环加载xml文件并注册bean definition
for (String configLocation : configLocations) {
reader.loadBeanDefinitions(configLocation);
}
下一章会剖析xml文件解析