【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. 构造方法注入无法解决循环依赖问题
相关推荐
行百里er3 小时前
2026:一名码农的“不靠谱”年度规划
后端·程序员·架构
全靠bug跑5 小时前
Spring Cache 实战:核心注解详解与缓存过期时间配置
java·redis·springcache
聆风吟º5 小时前
【数据结构手札】空间复杂度详解:概念 | 习题
java·数据结构·算法
计算机程序设计小李同学5 小时前
基于SpringBoot的个性化穿搭推荐及交流平台
java·spring boot·后端
是一个Bug5 小时前
50道核心JVM面试题
java·开发语言·面试
用户47949283569155 小时前
同事一个比喻,让我搞懂了Docker和k8s的核心概念
前端·后端
朱朱没烦恼yeye5 小时前
java基础学习
java·python·学习
她和夏天一样热6 小时前
【观后感】Java线程池实现原理及其在美团业务中的实践
java·开发语言·jvm
郑州光合科技余经理6 小时前
技术架构:上门服务APP海外版源码部署
java·大数据·开发语言·前端·架构·uni-app·php
篱笆院的狗6 小时前
Java 中的 DelayQueue 和 ScheduledThreadPool 有什么区别?
java·开发语言