# 《Spring核心技术》第20章-循环依赖:深度解析循环依赖(史上最全)

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-20 (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~


  • 本章难度:★★★★☆

  • 本章重点:进一步学习并掌握循环依赖相关的问题,从源码级别彻底掌握Spring解决循环依赖的执行流程。


本章目录如下所示:

  • 学习指引
  • 循环依赖概述
  • 循环依赖类型
    • 自我依赖
    • 直接依赖
    • 间接依赖
  • 循环依赖场景
    • 单例Bean的setter循环依赖的特殊情况
    • 多例Bean的setter循环依赖
    • 代理对象的setter循环依赖
    • 构造方法的循环依赖
    • @DependsOn的循环依赖
    • 单例Bean的setter循环依赖
  • Spring循环依赖底层解决方案分析
    • 不支持单例Bean的setter循环依赖的特殊情况
    • 不支持多例Bean的setter循环依赖
    • 不支持代理对象的setter循环依赖
    • 不支持构造方法的循环依赖
    • 不支持@DependsOn的循环依赖
    • 支持单例Bean的setter循环依赖
  • 总结
  • 思考
  • VIP服务

# 一、学习指引

Spring中的循环依赖问题,你真的彻底了解过吗?

Spring的循环依赖问题可以说是面试过程中出现的非常频繁的问题。比如,在面试过程中面试官可能会问:有了解过Spring中的循环依赖问题吗?或者会问:什么是循环依赖问题?或者会问:Spring中在哪些场景下会产生循环依赖问题?或者会问:Spring是如何解决循环依赖问题的?看似轻描淡写的一句话,实际要考察的内容也是比较多的。面试官可以通过这个问题考察面试者是否研究过Spring的源码,有没有了解过Spring中的循环依赖问题。

本章,我们就一起来聊聊Spring中的循环依赖问题。

# 二、循环依赖概述

什么是循环依赖?

循环依赖其实也很好理解,可以将这个词拆分成两部分,一个是循环,一个是依赖。循环,顾名思义就是指形成了一个闭合环路,也就是闭环。依赖就是指某个事件的发生要依赖另一个事件。

在Spring中的循环依赖就是指一个或者多个Bean之间存在着互相依赖的关系,并且形成了循环调用。例如,在Spring中,A依赖B,B又依赖A,A和B之间就形成了相互依赖的关系。创建A对象时,发现A对象依赖了B对象,此时先去创建B对象。创建B对象时,发现B对象又依赖了A对象,此时又去创建A对象。创建A对象时,发现A对象依赖了B对象....如果Spring不去处理这种情况,就会发生死循环,一直会创建A对象和B对象,直到抛出异常为止。

同理,在Spring中多个对象之间也有可能存在循环依赖,例如,A依赖B,B依赖C,C又依赖A,A、B、C之间形成了互相依赖的关系,这也是一种循环依赖。

# 三、循环依赖类型

循环依赖有这些类型呢?

循环依赖总体上可以分成:自我依赖、直接依赖和间接依赖三种类型,如图20-1所示。

图20-1

# 3.1 自我依赖

自我依赖就是自己依赖自己,从而形成的循环依赖,一般情况下不会发生这种循环依赖,如图20-2所示。

图20-2

# 3.2 直接依赖

直接依赖一般是发生在两个对象之间,例如对象A依赖对象B,对象B又依赖对象A,对象A和对象B之间形成了依赖关系,如图20-3所示。

图20-3

# 3.3 间接依赖

间接依赖一般是发生在三个或三个以上对象之间互相依赖的场景,例如对象A依赖对象B,对象B依赖对象C,对象C又依赖对象A,对象A、对象B和对象C之间就形成了循环依赖,如图20-4所示。

图20-4

# 四、循环依赖场景

Spring中有哪些循环依赖的场景?

Spring中的循环依赖场景总体上可以分成单例Bean的setter循环依赖、多例Bean的setter循环依赖、代理对象的setter循环依赖、构造方法的循环依赖和DependsOn的循环依赖。如图20-5所示。

图20-5

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码