辅助图解
1、spring启动之后,bean相关的定义信息会被loadBeanDefinition通过io等操作加载 2、加载后的bean定义信息转为Document对象,里面由很多父子节点 3、通过BeanDefinitionReader读取器读取到spring的container容器中 4、通过Document对象中的父子节点转化为BeanDefinition 5、放入beanDefinitionMap,遍历map验证(是否单例、是否延迟加载、是否抽象) 6、推断构造方法,准备开始进行实例、
循环依赖开始
7、1 首先去单例池中查找,查不到去二级缓存池去找, 7、2 没有则创建这个对象的objectFactory(半成品对象:利于拓展,程序员可以通过beanPostProcess接口操作objectFactory对象生成自己想要的对象)到二级缓存中。 7、3 属性注入阶段时发现当前对象A依赖另外一个对象B,此时B对象开始它的生命周期开始直到属性注入,发现自己依赖A对象, 7、4 在二级缓存中找的时候找到了A的objectFactory对象(半成品)对B对象进行属性注入, 7、5 完成B对象初始化依赖,将完整B对象放入单例池; 7、6 A对象属性注入B对象,然后完成A对象的整个初始化,将A对象放入单例池; 7、7 在A和B对象都放入单例池之后销毁二级缓存中的objectFactory对象。