天天看點

Spring如何解決循環依賴問題

現象:

循環依賴其實就是循環引用,也就是兩個或者兩個以上的bean互相持有對方,最終形成閉環。比如A依賴于B,B依賴于C,C又依賴于A。

Spring如何解決循環依賴問題

如何了解依賴?在spring中有:

(1)構造器循環依賴:結果:項目啟動失敗,發現了一個cycle

@Service
public class A {  
    public A(B b) {  }
}

@Service
public class B {  
    public B(C c) {  
    }
}

@Service
public class C {  
    public C(A a) {  }
}      

(2)field屬性注入循環依賴:結果:項目啟動成功

@Service
public class A1 {  
    @Autowired  
    private B1 b1;
}

@Service
public class B1 {  
    @Autowired  
    public C1 c1;
}

@Service
public class C1 {  
    @Autowired  public A1 a1;
}      

(3)field屬性注入循環依賴(prototype):結果:項目啟動失敗,發現了一個cycle。

@Service
@Scope("prototype")
public class A1 {  
    @Autowired  
    private B1 b1;
}

@Service
@Scope("prototype")
public class B1 {  
    @Autowired  
    public C1 c1;
}

@Service
@Scope("prototype")
public class C1 {  
    @Autowired  public A1 a1;
}      

現象總結:同樣對于循環依賴的場景,構造器注入和prototype類型的屬性注入都會初始化Bean失敗。因為@Service預設是單例的,是以單例的屬性注入是可以成功的。

分析原因:也就是在發現SpringIIOC的過程。