循环依赖
2021-03-14 本文已影响0人
Andy的故事
循环依赖是个典型的问题,我们看下在spring中是如何解决的
class A{ private B b;}
class B{ private A a;}
这个我们先分析一下bean在实例化过程中的几个阶段
①获取bean对应class的定义---获取A的class定义
②通过构造函数来反射生成对象---生成A对象
③设置对应的属性---设置B属性,又走一遍①②③步骤,这是就发生了循环引用
那我在第②步的时候设置一下缓存不就行了,等到第③步中实例化B对象需要A对象时,直接从缓存里面拿到A对象的引用就行了
这个里面只涉及到二级缓存,
一级:完整实例化对象的缓存(spring中的singletionObjects)
二级:未填充属性的实例化的对象的缓存(spring中的earlySingletionObjects)
我们看了下spring中,用到了三级缓存,为什么要用到三级缓存呢?
还是看看三级缓存里面存放的是什么
三级:未填充属性的实例化的原类对象的缓存 或者 未填充属性的实例化的原类的代理对象(singletionFactories)
主要是对AOP的处理(BeanPostProcessor)
个人理解:不一定对
①其实通过一级和二级缓存也是可以的,只不过在实例化的过程就要真实的处理AOP
②而spring对bean的生命周期的管理,是在实例化之后才进行AOP的处理,如果不采用三级缓存,那么对bean生命周期的管理就不统一了
以上属个人观点,欢迎大家讨论,随着理解的加深,可能会有更有说服力的结论给出