日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、什么是循環依賴

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

注意,這里不是函數的循環調用,是對象的相互依賴關系。循環調用其實就是一個死循環,除非有終結條件。

Spring中循環依賴場景有:

  • 構造器的循環依賴(構造器注入)
  • Field 屬性的循環依賴(set注入)

構造器的循環依賴問題無法解決,只能拋出BeanCurrentlyInCreationException 異常;在解決屬性循環依賴時,spring采用的是提前暴露對象的方法。

二、循環依賴處理機制

  • 單例 bean 構造器參數循環依賴(無法解決)
  • prototype 原型 bean循環依賴(無法解決)

對于原型bean的初始化過程中不論是通過構造器參數循環依賴還是通過setXxx方法產生循環依賴,Spring都會直接報錯處理。

AbstractBeanFactory.doGetBean()方法:

在獲取bean之前如果這個原型bean正在被創建則直接拋出異常。原型bean在創建之前會進行標記這個beanName正在被創建,等創建結束之后會刪除標記。

總結:Spring 不支持原型 bean 的循環依賴。

單例bean通過setXxx或者@Autowired進行循環依賴

Spring 的循環依賴的理論依據基于 JAVA 的引用傳遞,當獲得對象的引用時,對象的屬性是可以延后設置的,但是構造器必須是在獲取引用之前。

Spring通過setXxx或者@Autowired方法解決循環依賴其實是通過提前暴露一個ObjectFactory對象來完成的,簡單來說ClassA在調用構造器完成對象初始化之后,在調用ClassA的setClassB方法之前就把ClassA實例化的對象通過ObjectFactory提前暴露到Spring容器中。

  • Spring容器初始化ClassA通過構造器初始化對象后提前暴露到Spring容器。
  • ClassA調用setClassB方法,Spring首先嘗試從容器中獲取ClassB,此時ClassB不存在Spring容器中。
  • Spring容器初始化ClassB,同時也會將ClassB提前暴露到Spring容器中。
  • classB調用setClassA方法,Spring從容器中獲取ClassA ,因為第一步中已經提前暴露了ClassA,因此可以獲取到ClassA實例。
  • ClassA通過spring容器獲取到ClassB,完成了對象初始化操作。
  • 這樣ClassA和ClassB都完成了對象初始化操作,解決了循環依賴問題。

分享到:
標簽:Spring
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定