循环依赖:
Spring解决循环依赖的方法:三级缓存
为什么需要三级缓存:可能有需要AOP生成的代理对象
- 一级缓存:「singletonObjects」:缓存某个 beanName 对应的经过了完整生命周期的bean;
- 二级缓存:「earlySingletonObjects」:缓存提前拿原始对象进行了 AOP 之后得到的代理对象,原始对象还没有进行属性注入和后续的 BeanPostProcesso r等生命周期;
- 三级缓存:「singletonFactories」:缓存的是一个 ObjectFactory ,主要用来去生成原始对象进行了 AOP之后得到的「代理对象」,在每个 Bean 的生成过程中,都会提前暴露一个工厂,这个工厂可能用到,也可能用不到,如果没有出现循环依赖依赖本 bean,那么这个工厂无用,本 bean 按照自己的生命周期执行,执行完后直接把本 bean 放入 singletonObjects 中即可,如果出现了循环依赖依赖了本 bean,则另外那个 bean 执行 ObjectFactory 提交得到一个 AOP 之后的代理对象(如果有 AOP 的话,如果无需 AOP ,则直接得到一个原始对象)。
Spring 中哪些情况下,不能解决循环依赖问题?
1、prototype 类型的循环依赖
2、constructor 注入的循环依赖
3、@Async 类型的 AOP Bean 的循环依赖
这些解决不了的场景都可以通过 @Lazy 来解决掉。