【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. 构造方法注入无法解决循环依赖问题
相关推荐
ulias21214 分钟前
多态理论与实践
java·开发语言·前端·c++·算法
给我推荐个名字24 分钟前
pageoffice提取Excel表格区域数据
后端
幽络源小助理26 分钟前
SpringBoot+Vue攀枝花水果在线销售系统源码 | Java项目免费下载 – 幽络源
java·vue.js·spring boot
inBuilder低代码平台26 分钟前
浅谈安卓Webview从初级到高级应用
android·java·webview
豌豆学姐30 分钟前
Sora2 短剧视频创作中如何保持人物一致性?角色创建接口教程
android·java·aigc·php·音视频·uniapp
小肥宅仙女34 分钟前
限流方案
前端·后端
SadSunset35 分钟前
关于springAOP的总结
java·后端·spring
计算机学姐40 分钟前
基于SpringBoot的演出购票系统【2026最新】
java·vue.js·spring boot·后端·spring·tomcat·intellij-idea
清晓粼溪40 分钟前
RestTemplate
java·spring cloud
用户68026590511944 分钟前
2025年十大终端管理软件推荐指南
vue.js·后端·面试