2024-12-18  阅读(76)
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1642835402

回答

不一定需要!

Spring 三级缓存是解决循环依赖根本所在,但是,并不是说每种情况下解决循环依赖都必须使用三级缓存。对于无代理的单例 Bean,Spring 也可以仅需要二级缓存就可以解决循环依赖问题。

我们知道二级缓存是在创建实例后加入到缓存中的,如果要使用二级缓存来解决有代理场景下的循环依赖,我们只需要将 AOP 的代理工作提前到“提前暴露实例”的阶段执行就可以了,有就是说在创建实例阶段我们直接就创建代理对象,然后将代理对象放入到二级缓存中。但是这样设计的话就和 Spring AOP 的设计原则相驳:AOP 的实现需要与 bean 的正常生命周期的创建分离;按照 Spring AOP 的设计,代理对象的生成应该是在创建实例、属性填充、初始化之后再生成的。

所以,使用二级缓存是可以解决循环依赖,包括 AOP 的场景,但是,Spring 为了遵循 Spring AOP 的设计原则,采用了三级缓存来解决循环依赖。

详解

下面我们来看看,Spring 解决循环依赖一定需要三级缓存吗这个问题。我们需要先明确几个概念:

Spring 创建 Bean 的过程包括如下三个步骤: