Spring循环依赖
学习链接
https://www.yuque.com/renyong-jmovm/kb/dpzl6u
bean的生命周期
循环依赖实例
同样的B中有对A的依赖
循环依赖与生命周期
解决循环依赖的过程:三级缓存
B先取原始对象放进去,完成自己的初始化就打破了循环依赖
AOP存入单例池的对象不是new 出来的原始对象,而是经过代理的对象
由上,加一个缓存是不能彻底解决循环依赖的
所以说要有一个单例池,这就是二级缓存
这种就是没有手动注入到第三级缓存而导致循环依赖问题无法彻底解决
一级缓存是最终的单例池
二级缓存:提早生成的单例池
为什么要三级缓存ObjectFactory:存的是lambda表达式,也可以说是工厂,只有在产生循环依赖的时候才会去执行存入的工厂,直接生成代理对象
如果判断没有循环依赖也没有AOP,不会出现AOP引起的循环依赖问题,即最终存入的是代理对象而不是初始对象
就不需要执行三级缓存的lambda表达式,这时候的结果就是初始的对象
需要三级缓存的原因:保证只执行一次,防止反复执行工厂表达式。即在B的过程中判断后直接移除表达式,或者执行或者不执行但是一定要取出。因此保证执行一次
二级缓存:
A依赖B,B判断A需要经过AOP,取三级缓存的lambda表达式,生成A的提早暴露版本并放入二级缓存中
后续A再生成最终的资源时,直接取二级缓存结果,进行剩余的属性填充后最终进入一级缓存即可
二级与三级都是在解决循环依赖的时候用到的