在上文提到spring如何解决jvm循环依赖问题,本文详细介绍spring如何用三级缓存解决循环依赖问题
二.循环依赖的问题解决关键点对象的本质就是在堆区分配内存空间,并用引用进行强关联,而在类的实例化过程中,需要对类成员进行初始化,循环依赖的产生就是在对类的成员变量初始化过程中无法对成员对象进行初始化。
如果我可以在类的成员对象不进行初始化而只是申请内存空间并关联引用,或者直接将引用赋值Null,在类的初始化结束后,再对其成员对象进行赋值
这样,我们就可以解决循环依赖问题
三.解决核心方式spring解决循环依赖主要运用到反射和代理模式的方式
1.首先通过反射机制创建A对象(也就是为A对象分配内存空间)
2.将A对象的工厂bean,其实就是A对象的对象信息,类似于java.lang.class类放入第三级缓存
3.对beanA进行属性注入,也就是对成员对象B进行属性注入
4.通过反射创建B对象
5.将B对象的工厂bean,其实就是B对象的对象信息,类似于java.lang.class类放入第三级缓存
6.对beanB进行竖形注入,也就是对成员对象A进行属性注入
7.这个时候会先再1级缓存中查找是否有Abean,如果没有会去三级查找是否有A的工厂bean,如果有,则根据工厂bean创建A的代理对象,将代理对象填充到beanB的属性中,完成beanB的创建
8.将beanB放入二级缓存
9.将beanB注入beanA的属性中,完成beanA的初始化,并将beanA放入二级缓存,并替换beanB的成员beanA
四.为什么是三级维持程序设计的职责单一性
我们自然可以用一级缓存完成整个流程,但会导致再一级缓存中存储的数据杂乱,既有完整对象,又有工厂类对象,半成品对象,对于不同类型的资源调用十分混乱



