什么是循环依赖?
A对象依赖了B对象,B对象依赖了我A对象
A创建时--->需要B---->B去创建--->需要A,从而产生了循环
Spring如何解决循环依赖?
使用三级缓存
1. 第一级缓存:singletonObjects:缓存经过了完整生命周期的bean
2. 第二季缓存:earlySingletonObjects:缓存未经过完整生命周期的bean,如果某个bean出现了循环依赖,就会提前把这个暂时未经过完整生命周期的bean放入earlySingletonObjects中,这个bean如果要经过AOP,那么就会把代理对象放入earlySingletonObjects中,否则就是把原始对象放入earlySingletonObjects,(代理对象所代理的原始对象也是没有经过完整生命周期)。
3. 第三级缓存:singletonFactories:缓存的是一个ObjectFactory,是一个Lambda表达式。在每个Bean的生成过程中,经过实例化得到一个原始对象后,都会提前基于原始对象暴露一个Lambda表达式,并保存到三级缓存中,这个Lambda表达式可能用到,也可能用不到,如果当前Bean没有出现循环依赖,那么这个Lambda表达式没用,当前bean按照自己的生命周期正常执行,执行完后直接把当前bean放入singletonObjects中,如果当前bean在依赖注入时发现出现了循环依赖,则从三级缓存中拿到Lambda表达式,并执行Lambda表达式得到一个对象,并把得到的对象放入二级缓存(如果当前Bean需要AOP,那么执行lambda表达式,得到就是对应的代理对象,如果无需AOP,则直接得到一个原始对象)。
4. 还有一个缓存earlyProxyReferences,用来记录某个原始对象是否进行过AOP。