背景
最近在使用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;
}
}