首页 >文档 > spring如何解决循环依赖的问题 -csdn

spring如何解决循环依赖的问题 -csdn

Spring框架如何巧妙解决循环依赖问题?深度解析三级缓存机制实现原理!本文详细讲解Spring通过singletonObjects、earlySingletonObjects和singletonFactories三级缓存处理Bean循环依赖的核心流程,包括实例化、提前暴露ObjectFactory、获取早期引用等关键步骤。同时指出构造器注入和@Async代理等无法解决的循环依赖场景。掌握这些Spring面试必考知识点,助你在Java开发面试中脱颖而出。想要系统学习更多Spring核心原理?立即获取2025最新Java面试宝典合集,包含海量大厂真题及答案解析!

Spring如何解决循环依赖的问题

在Java面试中,Spring框架的循环依赖处理机制几乎是必考题。今天我们就来聊聊这个高频面试题背后的实现原理,帮你彻底搞懂Spring的三级缓存设计!

📌 2025年最新Java面试宝典合集
🔵 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g


🔄 什么是循环依赖

举个🌰:Bean A依赖Bean B,同时Bean B又依赖Bean A。这种"鸡生蛋还是蛋生鸡"的问题在Spring初始化时就会报BeanCurrentlyInCreationException

graph LR
    A[Bean A] -->|依赖| B[Bean B]
    B -->|依赖| A

⚙️ Spring的三级缓存机制

Spring通过三级缓存巧妙破局,核心在DefaultSingletonBeanRegistry中定义:

  1. singletonObjects(一级缓存):存放完全初始化的Bean
  2. earlySingletonObjects(二级缓存):存放半成品Bean(已实例化未注入属性)
  3. singletonFactories(三级缓存):存放Bean工厂对象

🛠️ 解决循环依赖的实战流程

假设现在有A和B互相依赖:

  1. 创建Bean A

    • 实例化A(此时还是个空对象)
    • 将A的工厂对象放入三级缓存
    • 开始给A注入属性...
  2. 发现需要Bean B

    • 暂停A的属性注入
    • 转向创建Bean B
  3. 创建Bean B

    • 实例化B(空对象)
    • 将B的工厂对象放入三级缓存
    • 给B注入属性时发现需要Bean A!
  4. 关键转折点 🔑

    • 从三级缓存拿到A的工厂对象
    • 通过getEarlyBeanReference()生成早期引用
    • 把A的早期引用放入二级缓存,同时移除三级缓存中的工厂
  5. 完成Bean B创建

    • 将完整B放入一级缓存
    • 回到Bean A的属性注入流程
  6. 最终闭环

    • A成功注入B实例
    • 将完整A放入一级缓存
    • 清理二级缓存中的临时对象

🚫 哪些循环依赖Spring解决不了

  1. 构造器注入的循环依赖
    // 这种直接报错!
    @Component
    public class A {
        private final B b;
        public A(B b) { this.b = b; }
    }
    
  2. @Async代理对象的循环依赖
  3. Prototype作用域的Bean循环依赖

💡 高频面试应答技巧

当面试官问:"Spring怎么解决循环依赖?"建议这样回答:

_"Spring通过三级缓存机制处理单例Bean的setter循环依赖。具体来说:

  1. 在Bean实例化后,会提前暴露ObjectFactory到三级缓存
  2. 当发生循环依赖时,通过三级缓存获取早期引用
  3. 解决了属性注入阶段的依赖闭环问题
    不过要注意,构造器注入的循环依赖是无解的"_

🎁 福利时间
准备Java面试需要系统化的题库训练!通过 面试鸭返利网 开通面试鸭会员可返利25元,海量真实大厂题库+详细题解助你快速通关:

面试鸭返利网优惠活动

✨ 小提示:在面试鸭刷题时遇到Spring循环依赖相关问题,记得结合三级缓存的源码分析(AbstractAutowireCapableBeanFactory#doCreateBean),绝对加分!

如果你想获取更多关于面试鸭的优惠信息,可以访问面试鸭返利网面试鸭优惠网,了解最新的优惠活动和返利政策。

🎯 立即加入面试鸭会员 →

扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)

面试鸭返利网客服-面试鸭返利网

面试鸭小程序码

面试鸭小程序码 - 面试鸭返利网

美团大额优惠券,给自己加个鸡腿吧!

美团大额优惠券,给自己加个鸡腿吧!

今日有支付宝大红包赶快领,手慢无

支付宝红包二维码

支付宝扫码领取1-8元无门槛红包

支付宝红包二维码