白話理解什麼是Spring迴圈依賴
阿新 • • 發佈:2021-11-25
我們知道Spring IOC是指的容器來負責建立Bean並負責處理Bean之間的依賴關係,比如有如下兩個類A、B:
@Component
public class A
@Autowired
private B b;
@Component
public class B
站在容器的角度,發現A依賴B,直接先建立B然後建立A,把B例項賦值給A的成員變數b,完事兒。
但如果是下面一種迴圈依賴的情況,按照上面的邏輯就不行了:
迴圈依賴
@Component public class A @Autowired private B b; @Component public class B @Autowired private C c; @Component public class C @Autowired private A a;
A依賴B、B依賴C、C又依賴A
如果你是容器,尼瑪到底該先建立誰??
解決思路
建立一個類例項之前,先去一個全域性的快取Map裡看下是否有這個類的例項,如果有則說明已經建立過、直接返回,如果沒有則建立。
建立A的例項,加入快取Map,遍歷A的屬性,發現B需要建立,建立B的例項也加入快取,遍歷B的屬性發現需要建立C,建立C的例項,遍歷C的屬性發現需要建立A的例項,但是A例項已經在快取了。迴圈結束。
下面按照上面的思路,寫下程式碼模擬迴圈依賴的解決: