Springboot循环依赖
背景
最近在使用Springboot做项目的时候,遇到了一个循环依赖的 问题。那什么是循环依赖呢,常见的一种情形就是在ServiceA中注入了ServiceB,在ServiceB中也注入了ServiceA。这种情况下,导致Spring在初始化的时候,无法决定先创建哪个Bean,从而导致了报错。
解决方案
优化代码
出现循环依赖,很大的可能性是代码的设计问题,导致了类的方法之间的交叉使用。因此,可以考虑优化代码,将公共的方法抽出来单独封装。
使用@Lazy注解
如果没有时间在短时间内重构完成,可以在互相依赖的两个Service上使用@Lazy注解,如下所示
@Component
public class ServiceA {
@Autowired
@Lazy
private ServiceB serviceB;
}
使用setter注入
我们还可以使用setter注入。当依赖最终被使用时才进行注入,对当前代码少做修改
@Component
public class ServiceA {
private ServiceB serviceB;
@Autowired
public void setServiceB(ServiceB serviceB) {
this.serviceB = serviceB;
}
}