【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. 构造方法注入无法解决循环依赖问题
相关推荐
黎雁·泠崖6 分钟前
【魔法森林冒险】2/14 抽象层设计:Figure/Person类(所有角色的基石)
java·开发语言
Java编程爱好者7 分钟前
Seata实现分布式事务:大白话全剖析(核心讲透AT模式)
后端
神奇小汤圆9 分钟前
比MySQL快800倍的数据库:ClickHouse的性能秘密
后端
小小张说故事40 分钟前
BeautifulSoup:Python网页解析的优雅利器
后端·爬虫·python
怒放吧德德41 分钟前
后端 Mock 实战:Spring Boot 3 实现入站 & 出站接口模拟
java·后端·设计
biyezuopinvip1 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
UrbanJazzerati1 小时前
Python编程基础:类(class)和构造函数
后端·面试
脸大是真的好~1 小时前
EasyExcel的使用
java·excel
小宋10211 小时前
Java 项目结构 vs Python 项目结构:如何快速搭一个可跑项目
java·开发语言·python
楚兴1 小时前
MacBook M1 安装 OpenClaw 完整指南
人工智能·后端