例如:A依赖B , B 依赖 C , C 依赖 A 这样就是一个简单的循环依赖。
创建bean的流程为:
一级缓存:singletonObjects
二级缓存:earlySingletonObjects
三级缓存:singletonFactories
1、创建A的时候 去一级缓存中查询A对象 为 null,这时会继续将A的实例创建出来(调用构造方法),未进行初始化,创建半成品A,将半成品A 放入到 三级缓存中。
2、初始化A的时候发现需要B,但是B未创建,这时走创建B的流程,这时会继续将B的实例创建出来(调用构造方法),未进行初始化,创建半成品B,将半成品B放入到三级缓存中。
3、初始化B的时候发现需要C,但是C未创建,这时走创建C的流程,这时会继续将C的实例创建出来(调用构造方法),未进行初始化,创建半成品C,将半成品C放入到三级缓冲中。
4、接下来初始化C发现需要A,从一级缓存和二级缓存中取不到A,但是从三级缓冲中取到A,将A放入到二级缓存并从三级缓存中清除。
5、C对象创建成功放入到一级缓存,C对象创建好了以后B对象也可以初始化成功,再将B对象放入一级缓存。
6、最后初始化A对象,放入一级缓存。
为什么要用三级缓存而是二级缓存?
二级缓存可以解决循环依赖的问题,但是不能解决aop场景下的循环依赖,这样注入到其他bean的都是原始对象,而不是最终的代理对象。
网友评论