
循环依赖是什么
程序员必备资源:2025年Java面试宝典已上传
链接: <font color="blue">https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g</font> 提取码: 9b3g
一、面试官为什么总爱问循环依赖?
最近在面试鸭返利网的社群里看到很多朋友反馈,面试时被问到循环依赖的场景越来越多了。这个问题看似简单,但如果没在实际项目中踩过坑,很容易在面试时卡壳。
举个例子:A类依赖B类,B类又依赖A类,程序启动时就会报错。这种"你中有我,我中有你"的关系,就像代码中的死锁,如果不解决系统根本无法运行。而现在的Spring框架虽然能自动处理部分循环依赖,但面试官更看重候选人是否理解背后的原理。

二、循环依赖的本质是什么?
从代码层面看,循环依赖是类之间的环形引用链。但底层原理要复杂得多:Spring通过三级缓存(singletonObjects、earlySingletonObjects、singletonFactories)解决这个问题。简单来说,就是先创建半成品对象,再通过属性注入补全依赖。
常见的三种循环依赖场景:
- 构造器循环依赖(Spring无法解决) 2.属性注入循环依赖 3.方法注入循环依赖
大家需要特别注意:使用@Lazy注解虽然能绕过部分问题,但会引入运行时隐患。就像给代码埋雷,面试官特别喜欢追问这种解决方案的副作用。
三、解决循环依赖的实战技巧
在实际编码中,推荐三种解决方案:
1. 代码重构优先 将公共逻辑抽离到第三个类,打破环形结构。比如把A和B共同依赖的方法提取到C类,这个技巧在系统重构时尤其有效。
2. 使用Setter注入 相比构造器注入,Setter注入允许对象先实例化再注入依赖。Spring正是利用这种特性,通过暴露未完成初始化的对象来解套。
3. 调整Bean加载顺序 通过@DependsOn注解强制指定加载顺序,或者拆分配置文件。这个方法在遗留系统改造时经常用到。

四、面试加分回答模板
当面试官问到循环依赖时,建议按照这个逻辑回答:
- 先说概念:"循环依赖是指两个或多个Bean相互依赖形成闭环"
- 举实际场景:"比如用户服务依赖积分服务,积分服务反过来也依赖用户服务"
- 讲解决方案:"Spring通过三级缓存机制处理属性注入的循环依赖,但构造器注入的场景需要代码调整"
- 补充注意事项:"要警惕循环依赖掩盖的设计问题,可能意味着模块职责不清晰"
如果想展示深度,可以提到Spring 5.2之后对prototype作用域的循环依赖处理优化,或者结合JVM类加载机制分析问题。
需要购买面试鸭会员的朋友,通过面试鸭返利网找我可返25元。现在很多互联网公司都在问框架底层原理,建议大家多看Spring容器的工作机制。其实循环依赖就像代码里的交通堵塞,找对疏导方法比硬碰硬更有效。


