原文地址:https://zhuanlan.zhihu.com/p/347097954

前言

相信很多小伙伴在工作中都会遇到循环依赖,不过大多数它是这样显示的:

https://pic4.zhimg.com/80/v2-92415c4625fb884e08822e284622eb77_1440w.png

还会提示这么一句:

Requested bean is currently in creation: Is there an unresolvable circular reference?

老铁!这就是发生循环依赖了!

当然这里是一个异常情况。

在我的一篇文章中介绍如何避免 Spring 自调用事务失效,其中网友给建议,说可以在类中注入自身,然后调用,而注入自身的过程也是循环依赖的处理过程。

下面就一起看一看,什么是循环依赖,以及 Spring 是如何解决循环依赖的?

什么是循环依赖

https://pic2.zhimg.com/80/v2-8040d89779bf9391281574d0df65e6b5_1440w.jpg

Dependency Resolution Process[1]

Spring IoC 容器会在运行时检测到构造函数注入循环引用,并抛出 BeanCurrentlyInCreationException。所以要避免构造函数注入,可以使用 setter 注入替代。

根据官方文档说明,Spring 会自动解决基于 setter 注入的循环依赖。

当然在咱们工作中现在都使用 @Autowired 注解来注入属性。

PS: @Autowired 是通过反射进行赋值。

这里从我们最经常使用的场景切入,看 Spring 是如何解决循环依赖的?

代码