循环依赖是Java开发中常见的问题,尤其在Spring框架中,当类A依赖类B,类B又依赖类A时,会导致程序启动失败。本文深入解析循环依赖的成因、常见场景及4种高效解决方案,包括代码重构、Setter注入、调整Bean加载顺序和Spring三级缓存机制。同时,揭秘循环依赖的坑点,如构造器注入的局限性和原型模式的限制,并提供面试实战技巧。通过优化设计和使用Spring特性,轻松穿透代码中的“死锁”困局,提升系统稳定性。立即学习,掌握循环依赖的破解之道!
2025年Java面试宝典(含高频考点):
点击领取
循环依赖就像两个朋友互相借钱——A说“你先借我,我再还你”,B说“你先还我,我再借你”。在代码中,类A依赖类B,类B又反过来依赖类A,这种“你中有我,我中有你”的结构会导致程序启动失败。
举个例子:Spring项目中,如果ServiceA调用了ServiceB的方法,而ServiceB又需要ServiceA的实例,启动时会直接报错:BeanCurrentlyInCreationException。
比如用户模块和订单模块互相调用:
UserService
需要调用OrderService
查询用户订单OrderService
又需要调用UserService
获取订单所属用户某些框架(如Spring)的配置类如果互相@Bean注入,也可能导致循环依赖。
核心逻辑:通过职责拆分,打破双向依赖。
UserService
和OrderService
的共同逻辑抽到CommonUtils
类中。适用框架:Spring
通过Setter方法而非构造器注入Bean,利用Spring的依赖注入机制延迟解决依赖。
// ServiceA中
private ServiceB serviceB;
@Autowired
public void setServiceB(ServiceB serviceB) {
this.serviceB = serviceB;
}
在Spring中,用@DependsOn
注解强制指定Bean的初始化顺序:
@Service
@DependsOn("serviceB")
public class ServiceA { ... }
Spring的底层黑魔法:
面试官:“如果项目中出现了循环依赖,你会怎么处理?”
参考答案:
如果需要系统性提升技术,推荐使用**面试鸭会员**解锁海量真题库和一对一模拟面试。通过面试鸭返利网联系我,可额外返利25元!
▶️ 本文首发于面试鸭返利网,转载请标注来源。
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!