Spring是怎么解决循环依赖的?

整个IOC容器解决循环依赖,用到的几个重要成员: singletonObjects:一级缓存,存放完全初始化好的Bean的集合,从这个集合中取出来的 Bean可以立马返回 earlySingletonObjects:二级缓存,存放创建好但没有初始化属性的Bean的集合,它用来解 决循环依赖 singletonFactories:三级缓存,存放单实例Bean工厂的集合 singletonsCurrentlyInCreation:存放正在被创建的Bean的集合

IOC容器解决循环依赖的思路:

  1. 初始化Bean之前,将这个BeanName放入三级缓存

  2. 创建Bean将准备创建的Bean放入 singletonsCurrentlyInCreation (正在创建的 Bean)

  3. createNewInstance 方法执行完后执行 addSingletonFactory,将这个实例化但没有 属性赋值的Bean放入二级缓存,并从三级缓存中移除

  4. 属性赋值&自动注入时,引发关联创建

  5. 关联创建时,检查“正在被创建的Bean”中是否有即将注入的Bean。如果有,检查二级 缓存中是否有当前创建好但没有赋值初始化的Bean。如果没有,检查三级缓存中是否有 正在创建中的Bean。至此一般会有,将这个Bean放入二级缓存,并从三级缓存中移除

  6. 之后Bean被成功注入,最后执行 addSingleton,将这个完全创建好的Bean放入一级缓 存,从二级缓存和三级缓存移除,并记录已经创建了的单实例Bean