循环依赖问题概述
循环依赖是指两个或多个Bean相互依赖,形成闭环(如A依赖B,B又依赖A)。Spring Boot默认情况下会抛出BeanCurrentlyInCreationException,但提供了一些解决方案。
使用@Lazy注解
通过延迟加载打破初始化时的循环依赖链。将@Lazy添加到其中一个依赖的Bean声明或注入点:
@Service
public class ServiceA {
private final ServiceB serviceB;
@Autowired
public ServiceA(@Lazy ServiceB serviceB) {
this.serviceB = serviceB;
}
}
或直接在类上标注:
@Service
@Lazy
public class ServiceB { ... }
改用Setter/方法注入
将字段注入改为Setter方法注入,Spring会在Bean初始化后处理依赖:
@Service
public class ServiceA {
private ServiceB serviceB;
@Autowired
public void setServiceB(ServiceB serviceB) {
this.serviceB = serviceB;
}
}
使用@PostConstruct初始化
通过@PostConstruct在Bean完全构造后执行依赖逻辑:
@Service
public class ServiceA {
@Autowired
private ServiceB serviceB;
@PostConstruct
public void init() {
serviceB.setServiceA(this); // 解决循环调用
}
}
重构代码设计
- 提取公共逻辑:将相互依赖的部分抽离到第三个Bean中。
- 接口分离:通过接口降低直接依赖,例如依赖抽象而非具体实现。
配置允许循环依赖(不推荐)
在application.properties中强制允许循环依赖(仅用于临时调试):
spring.main.allow-circular-references=true
此方法可能掩盖设计问题,建议优先通过前几种方式解决。
2242

被折叠的 条评论
为什么被折叠?



