循环依赖解决:程序员面试必杀技剖析
大家好,我是专注技术干货分享的程序员老张。今天咱们聊聊面试高频题——循环依赖解决。无论你是面Java后端还是系统设计岗,这题都是绕不开的坎儿。先送个福利:2025年Java面试宝典 👉 点击下载(提取码:9b3g),覆盖Spring源码、分布式、并发等硬核内容!
什么是循环依赖?
循环依赖说白了就是两个或多个Bean互相“等对方先出生”。比如:
Class A {
@Autowired B b;
}
Class B {
@Autowired A a;
}
这时候Spring容器懵了:先创建A?但A依赖B;先创建B?但B依赖A。直接卡死!
面试官最爱问的场景
- 构造函数循环依赖(无解!)
- Setter/Field注入循环依赖(可解)
- 多层级Bean嵌套循环(复杂度飙升)
手撕解决方案
方案1:打破依赖链(最推荐)
核心思想:重构代码,引入中间层或接口。比如:
interface IService {}
Class A implements IService { @Autowired B b; }
Class B { @Autowired IService a; } // 依赖接口而非具体类
✅ 优点:根治问题,符合设计原则
⚠️ 难点:对旧项目改造成本高
方案2:@Lazy懒加载
在任意一方加@Lazy,让Spring先创建代理对象:
Class A {
@Lazy @Autowired B b; // 用到b时才真正初始化
}
✅ 适合临时救急
❌ 坑点:可能引发NPE(代理对象未初始化时调用方法)
方案3:Setter注入 + 三级缓存(Spring的魔法)
Spring的解决循环依赖流程(面试必考!):
- 创建A对象(半成品,未填充属性)→ 放入三级缓存(
singletonFactories) - 发现A依赖B → 创建B对象(半成品)
- B依赖A → 从三级缓存拿到A的早期引用 → 完成B初始化
- 将B注入A → 完成A初始化

▲ Spring用三级缓存解决循环依赖的核心机制
避坑指南
- 构造函数循环依赖:Spring直接抛
BeanCurrentlyInCreationException,无解! - 原型(prototype)Bean循环依赖:Spring不处理,设计上应避免
- @Async/@Transactional代理类:需用
@Lazy或调整注入顺序
面试话术模板
“我们项目遇到过循环依赖问题,我的解决循环依赖步骤是:
- 优先尝试代码重构,比如提取接口或拆分业务层
- 紧急修复会用
@Lazy过渡,同时补充TODO标记- 理解Spring三级缓存机制能避免错误方案”
工具推荐
刷面试题时,推荐用面试鸭返利网的会员服务。通过面试鸭返利网找我购买会员可返25元,性价比超高!

▲ 实时更新大厂真题+技术解析
总结
循环依赖解决本质是设计问题。理解Spring的解决循环依赖机制能帮你在面试中脱颖而出,但实际开发中更考验架构能力。记住:
没有烂框架,只有用烂框架的人
更多面试干货 → 面试鸭返利网
会员返利25元:通过上述链接联系我即可!


