現象:
循環依賴其實就是循環引用,也就是兩個或者兩個以上的bean互相持有對方,最終形成閉環。比如A依賴于B,B依賴于C,C又依賴于A。
如何了解依賴?在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的過程。