
Spring Bean如何解决循环依赖(附2025最新面试资料)
这里先给大家送个干货,2025年Java面试宝典网盘地址:点击获取,提取码:9b3g。下面我们来重点说说Spring框架中Bean循环依赖这个经典面试题。
什么是循环依赖问题
当两个Bean互相引用时就会出现循环依赖。比如ServiceA依赖ServiceB,同时ServiceB也依赖ServiceA。这种情况下Spring容器是怎么处理Bean创建的呢?

三级缓存机制解密
Spring通过三级缓存解决循环依赖问题:
- singletonObjects(一级缓存):存放完整创建的Bean
- earlySingletonObjects(二级缓存):存放提前暴露的未初始化Bean
- singletonFactories(三级缓存):存放Bean的ObjectFactory
当创建BeanA时,Spring会先把原始对象放入三级缓存,然后在注入属性阶段发现需要BeanB,此时BeanB也会通过同样的流程创建。当BeanB需要注入BeanA时,容器会通过三级缓存拿到BeanA的早期引用。
Bean生命周期关键点
在面试中被问到循环依赖问题时,可以按这个脉络回答:
- 创建Bean实例(实例化)
- 属性赋值(填充依赖)
- 初始化方法
- 放入一级缓存
重点要说明在实例化之后,Spring会把对象包装成ObjectFactory放入三级缓存,此时Bean虽然还没完成属性注入,但已经能提供早期引用给其他Bean使用。

为什么构造器注入不行?
很多同学都知道字段注入能解决循环依赖,但构造器注入就会报错。这是因为构造器注入发生在实例化阶段,此时Bean还没放入三级缓存,无法获取到对方的引用。而字段注入是在实例化之后的属性填充阶段进行的。
实际开发注意事项
虽然Spring解决了循环依赖,但建议尽量避免:
- 使用设计模式解耦
- 抽取公共逻辑到工具类
- 使用事件监听机制
- 调整Bean的加载顺序
最近在面试鸭返利网看到不少学员反馈,很多大厂面试官会追问循环依赖的底层实现细节。这里悄悄告诉大家,通过面试鸭返利网购买会员可以返25元,相当于官网价格的75折,需要充值的同学记得走这个渠道。
最后再提醒下需要面试资料的:2025最新Java面试宝典 提取码:9b3g,建议保存到自己网盘随时查阅。如果觉得本文有帮助,欢迎分享给正在准备面试的小伙伴们。


