【Spring】循环依赖

什么是循环依赖

循环依赖(Circular Dependency),也称为循环引用,是指两个或多个对象(在Spring框架中通常指的是Bean)之间相互依赖,最终形成了一个依赖的闭环。具体来说,如果对象A依赖于对象B,而对象B又依赖于对象A,或者通过其他对象间接形成依赖闭环,那么这种情况就被称为循环依赖。

两种注入方式对循环依赖的影响

构造方法注入

构造方法注入要求在Bean实例化时就必须提供所有必要的依赖。这意味着,如果Bean A的构造方法依赖于Bean B,而Bean B的构造方法又依赖于Bean A,那么Spring在尝试创建这两个Bean时就会陷入一个死循环。因为Spring需要先创建Bean B来实例化Bean A,但同时又需要Bean A来实例化Bean B。

set方法注入

先无参构造,后set注入

三级缓存

  • 单例池(Singleton Objects Cache):这可以看作是Spring中的"一级缓存"。它存储了已经完全初始化好的Bean实例。当一个Bean被完全初始化后,它会被放入这个缓存中,以供后续直接使用。
  • 早期曝光对象缓存(Early Singleton Objects Cache):这可以看作是"二级缓存"。在处理循环依赖时,如果一个Bean正在被创建,但尚未完成初始化(比如其依赖项尚未注入),这个Bean的早期版本(即还未设置其依赖项的版本)会被放入这个缓存中。这样,如果另一个Bean在创建过程中需要依赖这个正在创建的Bean,就可以从这个缓存中获取到这个Bean的早期版本。
  • 原始Bean工厂缓存(Singleton Factories Cache):这可以看作是"三级缓存"。它存储的是ObjectFactory对象,这些对象用于生成Bean的实例。当一个Bean被创建但尚未初始化时,Spring会为这个Bean生成一个ObjectFactory,并将其放入这个缓存中。如果其他Bean需要这个Bean的实例,Spring会从缓存中获取ObjectFactory,并调用其方法来生成Bean的实例。这样做的好处是,它允许Spring在Bean完全初始化之前,就提供一个Bean的实例给其他Bean使用,从而解决了循环依赖的问题。

无法解决的循环依赖情况

  1. 构造方法注入无法解决循环依赖问题
相关推荐
weixin_460443563 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
子兮曰3 小时前
把 649 种文件格式塞进一个网页里:一个「文件不出浏览器」的预览器
前端·javascript·后端
海鸥-w6 小时前
什么是AOP
java
java资料站6 小时前
十一、Spring AI Alibaba · 高级 · 多智能体(Multi-agent)
人工智能·spring·microsoft
全栈弄潮儿6 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
Cc.Y6 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck6 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787056 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev6 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计