BeanFactory初始化
BeanFactory创建流程包含两个步骤,一个是生成BeanFactory,另一个是解析配置文件中的javabean,并封装为BeanDefinition
并将BeanDefinition加载到 IoC 容器中(BeanDefinition是xml文件中对bean的描述,包括是否懒加载,单例多例,dependson等)
依次调用多个类的 loadBeanDefinitions 方法 —> AbstractXmlApplicationContext —> AbstractBeanDefinitionReader —> XmlBeanDefinitionReader 一直执行到 XmlBeanDefinitionReader 的 doLoadBeanDefinitions 方法 |
Bean创建流程
ioc管理的bean均为单例、不是抽象且不是懒加载的
Bean创建子流程入口在AbstractApplicationContext#refresh()方法的finishBeanFactoryInitialization(beanFactory) 处
通过getBean的方法获取实例
进入AbstractBeanFactory类的doGetBean,再进入createBean,doCreateBean
通过createBeanInstance执行bean构造器,进行bean初始化
通过popularBean进行属性填充
通过BeanPostProcessor执行后置处理器的postProcessBeforeInitialization-->initializingBean#afterPropertiesSet-->init-method-->postProcessAfterInitialization进行增强
如果Bean实现了DisposableBean接口,会调用其实现的destroy方法
如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法
bean循环依赖
a依赖b,b依赖a
先执行a构造器生成a的objectFactory存到三级缓存中,在popularBean填充属性时发现依赖于b
通过b的构造器生成b的objectFactory,放到三级缓存,在popularBean填充属性时发现依赖于a
检查发现a存在于三级缓存,且是objectFactory状态,生成不完全的a放到二级缓存,并与b绑定
b属性设置完成后,再继续初始化a,完成后转到一级缓存
构造器注入无法实现循环依赖,因为必须先通过构造器在三级缓存中生成objectFactory,才能完成之后的循环依赖