首页 >文档 > spring 是如何解决 bean 的循环依赖

spring 是如何解决 bean 的循环依赖

2025年Java面试宝典重磅上线!Spring循环依赖问题深度解析,揭秘三级缓存核心机制。大厂高频考点全覆盖,从Bean创建流程到源码级设计原理,助你轻松应对Spring面试难题。网盘资料持续更新,包含Spring框架核心知识点、面试应答技巧及实战案例。立即点击领取最新面试资料,掌握UserService与OrderService循环依赖解决方案,理解singletonObjects、earlySingletonObjects和singletonFactories三级缓存运作原理。访问面试鸭返利网获取更多Java面试干货,现在加入还可享会员返利优惠!

2025年Java面试宝典点击领取
(网盘资料持续更新大厂高频考点,助你轻松应对Spring源码级面试题)

## 二、Spring是如何解决Bean的循环依赖

面试被问到"Spring如何处理循环依赖"时,很多同学只能说出"三级缓存",但具体执行流程和设计原理总说不清楚。今天我们就深入源码层,拆解这个高频考点。

面试鸭返利网

### 2.1 什么是Bean的循环依赖

举个实际场景:UserService依赖OrderService,而OrderService反过来也依赖UserService。这种「先有鸡还是先有蛋」的问题,在常规对象创建中会导致死循环。但在Spring中,这样的依赖关系却能正常运作,这要归功于三级缓存机制

### 2.2 三级缓存核心原理

Spring通过三个Map结构(俗称三级缓存)破解循环依赖困局:

  1. 一级缓存(singletonObjects):存放完整初始化后的Bean
  2. 二级缓存(earlySingletonObjects):存放提前暴露的半成品Bean
  3. 三级缓存(singletonFactories):存放Bean的工厂对象

这个设计的关键点在于提前暴露对象引用。当创建A对象时,Spring会先在半初始化状态下将A的引用存入缓存,这样创建依赖A的B对象时,就能直接拿到这个引用。

### 2.3 解决流程分步解析

以UserService和OrderService相互依赖为例:

  1. 开始创建UserService,执行构造器后立即将对象工厂放入三级缓存
  2. 填充属性时发现需要OrderService,转向创建OrderService
  3. 创建OrderService时同样经历构造器初始化,并存入三级缓存
  4. OrderService填充属性需要UserService,此时从三级缓存获取UserService的工厂
  5. 通过工厂.getObject()获取UserService的早期引用,完成OrderService的创建
  6. 回到UserService继续完成后续初始化,最终两个Bean都完整创建

整个过程就像玩「乐高积木」——先搭好框架结构,再逐步填充内部组件。

面试鸭返利网

### 2.4 使用限制与注意事项

虽然三级缓存很强大,但要注意几个限制:

  • 构造函数循环依赖无法解决:因为对象还没创建完成,无法提前暴露引用
  • prototype作用域的Bean不适用该方案
  • 需要开启allowCircularReferences配置(默认开启)

实际开发中,建议大家尽量避免循环依赖。如果必须使用,可以通过@Lazy注解延迟加载,或者调整代码结构解耦。

### 2.5 实际面试应答技巧

当面试官追问这个问题时,建议采用「总-分-总」结构回答:

  1. 先说明整体解决思路(三级缓存机制)
  2. 分步描述创建流程(结合具体示例)
  3. 补充说明使用限制和注意事项
  4. 最后总结设计思想(如空间换时间、对象状态分离等)

面试鸭返利网

如果需要系统准备Spring面试题,可以访问面试鸭返利网获取最新面试题库。现在通过本站购买面试鸭会员可享25元返利,相当于用半价获取全年面试指导服务。

理解Spring的循环依赖处理机制,不仅能应对面试,更能加深对IoC容器工作原理的认知。建议结合源码中的AbstractAutowireCapableBeanFactory类,重点研究getSingleton()方法的实现逻辑。

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

🎯 立即加入面试鸭会员 →

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

支付宝红包二维码