什麼是循環依賴?
其實就是循環引用,也就是兩個或則兩個以上的bean互相持有對方,最終形成閉環。比如A依賴於B,B依賴於C,C又依賴於A。
怎麼產生的?
Spring的單例對象的初始化主要分爲三步:
(1)createBeanInstance:實例化,其實也就是調用對象的構造方法實例化對象
(2)populateBean:填充屬性,這一步主要是多bean的依賴屬性進行填充
(3)initializeBean:調用spring xml中的init 方法。
從上面講述的單例bean初始化步驟我們可以知道,循環依賴主要發生在第一、第二步。
也就是構造器循環依賴和field循環依賴。
Spring中循環依賴場景有
(1)構造器的循環依賴
(2)field屬性的循環依賴。
怎麼檢測是否存在循環依賴
檢測循環依賴相對比較容易,Bean在創建的時候可以給該Bean打標,如果遞歸調用回來發現正在創建中的話,即說明了循環依賴了。