Spring Bean循环依赖是Java面试高频考点,本文深度解析Spring三级缓存机制如何解决循环依赖问题。详细讲解单例模式下属性注入的解决方案,分析构造器注入、AOP代理等无法解决的场景,并提供@Lazy注解、接口分离等实用避坑技巧。包含大厂面试常见问题如三级缓存区别、原型作用域处理等,助你掌握Spring框架核心机制。附2025年最新Java面试宝典下载,涵盖阿里、腾讯等大厂真题,备考必备资料。需要面试鸭会员可享25元专属优惠,快速提升面试通过率。
2025年Java面试宝典网盘地址
提取码:9b3g(建议保存备用,涵盖大厂高频考点)
循环依赖就是两个或多个Bean相互引用,比如A依赖B,B又反过来依赖A,形成"鸡生蛋蛋生鸡"的死循环。这种情况会导致Spring容器在初始化时抛出BeanCurrentlyInCreationException
,直接影响项目启动。
面试官特别喜欢问这个问题,因为它既考察IOC容器底层机制,又涉及实际开发经验。
Spring通过三级缓存来破解这个困局:
具体处理流程分三步走:
这里有个重要前提——必须使用属性注入方式。如果是构造器注入,Spring也无能为力,因为要创建Bean必须先完成构造器调用,而构造参数中的依赖此时还未创建。
// 这种写法会导致启动失败
@Service
public class A {
private final B b;
public A(B b) { this.b = b; }
}
@Service
public class B {
private final A a;
public B(A a) { this.a = a; }
}
如果循环依赖的Bean需要生成代理对象(比如@Async、@Transactional等场景),必须保证:
当通过@DependsOn手动指定依赖顺序时,如果形成循环链,Spring会直接拒绝创建。
如果大家在准备面试时需要购买面试鸭会员,可以通过面试鸭返利网联系我,可享25元专属返利。更多技术干货可以下载开头的面试宝典,覆盖最新大厂真题。
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包