回答
不一定需要!
Spring 三级缓存是解决循环依赖根本所在,但是,并不是说每种情况下解决循环依赖都必须使用三级缓存。对于无代理的单例 Bean,Spring 也可以仅需要二级缓存就可以解决循环依赖问题。
我们知道二级缓存是在创建实例后加入到缓存中的,如果要使用二级缓存来解决有代理场景下的循环依赖,我们只需要将 AOP 的代理工作提前到“提前暴露实例”的阶段执行就可以了,有就是说在创建实例阶段我们直接就创建代理对象,然后将代理对象放入到二级缓存中。但是这样设计的话就和 Spring AOP 的设计原则相驳:AOP 的实现需要与 bean 的正常生命周期的创建分离;按照 Spring AOP 的设计,代理对象的生成应该是在创建实例、属性填充、初始化之后再生成的。
所以,使用二级缓存是可以解决循环依赖,包括 AOP 的场景,但是,Spring 为了遵循 Spring AOP 的设计原则,采用了三级缓存来解决循环依赖。
详解
- 关于三级缓存请阅读面试题:什么是Spring的三级缓存?
- 关于Spring 是如何解决循环依赖的请阅读文章:Spring是如何解决循依赖问题?
下面我们来看看,Spring 解决循环依赖一定需要三级缓存吗这个问题。我们需要先明确几个概念:
Spring 创建 Bean 的过程包括如下三个步骤: