
写在前面
2025年最新Java面试宝典已整理完毕,包含Spring全家桶、JVM、并发编程等高频考点,需要的同学自取:
👉点击获取:2025年Java面试宝典网盘地址
提取码: 9b3g (有效期30天,建议尽快保存)
Spring 2.6循环依赖高频面试题深度解析
最近在技术社群里看到不少同学反馈,Spring循环依赖问题在面试中频繁出现。尤其是当面试官问到**"Spring 2.6版本如何处理循环依赖"**时,很多同学只能回答三级缓存这个表层概念。今天我们就从源码层面拆解这个问题,帮你在面试中展现真正的技术实力。

循环依赖的三大核心战场
在Spring 2.6版本中,循环依赖的处理主要围绕这三个关键环节展开:
-
构造器注入死局
当A和B都使用构造器注入对方时,Spring会直接抛出BeanCurrentlyInCreationException。这种情况就像两个程序员互相等对方写接口文档,结果谁都动不了手。 -
Setter注入破局之道
通过提前暴露半成品对象(early reference),Spring采用三级缓存机制化解僵局。这个过程就像装修房子时,电工先拉好线管框架,等泥工补完墙再回来装开关。 -
@Lazy缓兵之计
在注入点添加@Lazy注解,相当于给依赖关系加了个"稍后处理"的标签。这时候Spring会先创建代理对象,等真正需要时才完成注入。
三级缓存的精妙设计
很多面试者知道三级缓存的概念,但被追问设计初衷时就卡壳了。我们通过一个真实场景来理解:
假设Bean A依赖Bean B,Bean B又依赖Bean A:
- 创建A时发现需要B,将A的早期引用放入三级缓存(singletonFactories)
- 开始创建B,发现需要A,此时从三级缓存拿到A的工厂对象
- 通过工厂获取A的早期引用,完成B的创建
- 最后回填A的完整属性
重点提示:Spring 2.6对缓存策略做了优化,当使用AOP代理时,会通过二级缓存避免重复创建代理对象。这点在面试中能说出来,绝对加分!
高频面试问题拆解
最近收集了20+场真实面经,整理了三个必考题:
Q1:为什么要用三级缓存而不是二级?
典型错误回答:"为了存储不同的对象状态"
正确姿势:要关联AOP代理机制。三级缓存保存的是ObjectFactory,可以延迟代理对象的生成,避免在属性注入前就创建代理导致后续处理异常。
Q2:循环依赖对Bean生命周期的影响?
结合源码中的关键方法说明:
getSingleton() → createBean() → populateBean() → initializeBean()
这个过程如何被循环依赖打乱重组,需要说清楚"早期暴露"发生的具体阶段。
Q3:Spring Boot 2.6为何默认禁止循环依赖?
这不是Spring Framework的限制,而是Spring Boot的主动设计。重点说明:
- 良好的设计应避免循环依赖
- 强制开发者直面架构问题
- 可通过spring.main.allow-circular-references=true恢复
避坑指南与实战技巧
在最近帮读者review代码的过程中,发现了几个典型案例:
- 混用@Async和循环依赖导致的代理问题
- 多数据源配置中AbstractRoutingDataSource的初始化陷阱
- 使用@Transactional时由CGLIB代理引发的依赖链断裂
建议在开发阶段就开启循环依赖检测:
spring.main.allow-circular-references=false
让问题在本地就暴露出来,避免带到生产环境。

学习资源推荐
在准备面试过程中,合理使用学习工具可以事半功倍。这里推荐大家关注面试鸭返利网,最近他们推出限时活动:通过官网购买面试鸭会员可返现25元,相当于用更低的成本获得全站技术题库和真题解析。
需要重点突击Spring源码的同学,记得下载开头的Java面试宝典。里面整理了Spring 2.6的15个核心模块执行流程图,包括循环依赖处理的完整时序图,帮你真正吃透底层原理。
最后提醒:理解循环依赖的关键是跟着Spring的Bean创建流程走一遍,最好能对着源码中的AbstractAutowireCapableBeanFactory类逐行分析。遇到卡壳的地方,可以到面试鸭社区提问,有专家在线答疑哦!


