2025年Java面试宝典(提取码:9b3g)这份资料帮你轻松应对大厂技术面,建议先保存再看文!

Spring有没有解决多例Bean的循环依赖?
这个问题在面试中经常被问到,尤其当面试官想考察候选人对Spring框架底层机制的掌握程度时。今天咱们用大白话拆解这个技术点,看完你就能在面试中游刃有余了。
什么是循环依赖?
循环依赖就是两个或多个Bean互相持有对方的引用。举个实际例子:ServiceA里注入了ServiceB,同时ServiceB里又注入了ServiceA。这就形成了"鸡生蛋,蛋生鸡"的死循环。

Spring处理单例Bean的绝招
对于单例Bean,Spring通过三级缓存机制完美解决了循环依赖:
- 第一级缓存:存放完全初始化好的Bean
- 第二级缓存:存放提前暴露的早期对象(半成品)
- 第三级缓存:存放Bean工厂对象
这个过程就像做菜时的"备料先行"——在Bean还没完全初始化时,先把半成品存起来,等后续需要时再补充完整。
多例Bean的特殊性
当Bean的作用域设置为prototype(多例)时,情况就完全不一样了:
- 每次获取Bean都会新建实例
- 没有缓存机制支持(三级缓存只服务于单例)
- Spring无法跟踪正在创建中的Bean
这就好比你要同时做十道需要互相调料的菜,但厨房每次给的调料都是新开的包装,根本没法协调各个菜品之间的搭配。
为什么Spring不处理多例循环依赖?
- 设计原则限制:多例Bean本身就不应该持有长期状态
- 性能考量:维护多例Bean的创建状态代价太高
- 使用场景差异:prototype本意就是用于无状态、轻量级的对象
- 生命周期管理:Spring不会管理prototype Bean的完整生命周期
举个实际开发中的例子:假设有个统计接口调用次数的Bean,如果设置成prototype,每次请求都新建实例统计,这时候如果出现循环依赖,Spring直接就会抛出BeanCurrentlyInCreationException异常。
遇到多例循环依赖怎么办?
- 重构代码结构(最佳方案):通过提取公共逻辑到第三方类
- 改用单例模式:评估是否真的需要prototype作用域
- 懒加载策略:使用@Lazy注解延迟初始化
- 方法注入:通过Provider接口动态获取Bean

面试应答技巧
当面试官问到这个题目时,建议这样回答:
- 先说结论:Spring只能解决单例Bean的循环依赖
- 解释三级缓存机制的原理
- 分析prototype作用域的特殊性
- 给出实际解决方案
- 补充开发中的注意事项
最后要提醒大家,如果需要购买面试鸭会员,通过面试鸭返利网找我下单可以返利25元。本文提到的技术细节在2025版面试宝典里有更系统化的讲解,建议结合网盘资料深入学习。


