循环依赖
循环依赖只会出现在 单例情况(非原形prototype)下,并且通过属性设置(非构造函数方式)成员变量的情况下。
DefaultSingletonBeanRegistry
三级缓存(三个map)
singletonObjects ConcurrentHashMap<String, Object> 存放已经经历了完整周期的bean对象
earlySingletonObjects HashMap<String, Object> 存放早期暴露出来,未完成完整周期(属性未设置)的bean对象
singletonFactorys HashMap<String, ObjectFactory> 存放生成bean的工厂类:
举例:
A, B循环引用,创建A时,查找缓存,都没有,把A对应的工程类放入到三级缓存,发现A依赖B, 创建B,创建B时,把B的工厂类放到三级缓存中,B依赖A, 从缓存中查找A, 发现在三级缓存中有A的工厂类,然后A初始化,此时A的初始化对象就放到二级缓存中,B中的属性指向A的初始化对象,B完成创建,放入到一级缓存,此时A也可以完成属性填充,填充完,进入一级缓存。