新聞中心
一、什么是循環(huán)依賴
循環(huán)依賴其實(shí)就是循環(huán)引用,也就是兩個(gè)或者兩個(gè)以上的 Bean 互相持有對(duì)方,最終形成閉環(huán)。比如A依賴于B,B依賴于C,C又依賴于A。

創(chuàng)新互聯(lián)公司是一家從事企業(yè)網(wǎng)站建設(shè)、做網(wǎng)站、成都做網(wǎng)站、行業(yè)門(mén)戶網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)制作的專業(yè)網(wǎng)站設(shè)計(jì)公司,擁有經(jīng)驗(yàn)豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁(yè)設(shè)計(jì)人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實(shí)力,在網(wǎng)站建設(shè)領(lǐng)域樹(shù)立了自己獨(dú)特的設(shè)計(jì)風(fēng)格。自公司成立以來(lái)曾獨(dú)立設(shè)計(jì)制作的站點(diǎn)上1000+。
注意,這里不是函數(shù)的循環(huán)調(diào)用,是對(duì)象的相互依賴關(guān)系。循環(huán)調(diào)用其實(shí)就是一個(gè)死循環(huán),除非有終結(jié)條件。
Spring中循環(huán)依賴場(chǎng)景有:
- 構(gòu)造器的循環(huán)依賴(構(gòu)造器注入)
- Field 屬性的循環(huán)依賴(set注入)
構(gòu)造器的循環(huán)依賴問(wèn)題無(wú)法解決,只能拋出BeanCurrentlyInCreationException 異常;在解決屬性循環(huán)依賴時(shí),spring采用的是提前暴露對(duì)象的方法。
二、循環(huán)依賴處理機(jī)制
- 單例 bean 構(gòu)造器參數(shù)循環(huán)依賴(無(wú)法解決)
- prototype 原型 bean循環(huán)依賴(無(wú)法解決)
對(duì)于原型bean的初始化過(guò)程中不論是通過(guò)構(gòu)造器參數(shù)循環(huán)依賴還是通過(guò)setXxx方法產(chǎn)生循環(huán)依賴,Spring都會(huì)直接報(bào)錯(cuò)處理。
AbstractBeanFactory.doGetBean()方法:
在獲取bean之前如果這個(gè)原型bean正在被創(chuàng)建則直接拋出異常。原型bean在創(chuàng)建之前會(huì)進(jìn)行標(biāo)記這個(gè)beanName正在被創(chuàng)建,等創(chuàng)建結(jié)束之后會(huì)刪除標(biāo)記。
總結(jié):Spring 不支持原型 bean 的循環(huán)依賴。
單例bean通過(guò)setXxx或者@Autowired進(jìn)行循環(huán)依賴
Spring 的循環(huán)依賴的理論依據(jù)基于 Java 的引用傳遞,當(dāng)獲得對(duì)象的引用時(shí),對(duì)象的屬性是可以延后設(shè)置的,但是構(gòu)造器必須是在獲取引用之前。
Spring通過(guò)setXxx或者@Autowired方法解決循環(huán)依賴其實(shí)是通過(guò)提前暴露一個(gè)ObjectFactory對(duì)象來(lái)完成的,簡(jiǎn)單來(lái)說(shuō)ClassA在調(diào)用構(gòu)造器完成對(duì)象初始化之后,在調(diào)用ClassA的setClassB方法之前就把ClassA實(shí)例化的對(duì)象通過(guò)ObjectFactory提前暴露到Spring容器中。
- Spring容器初始化ClassA通過(guò)構(gòu)造器初始化對(duì)象后提前暴露到Spring容器。
- ClassA調(diào)用setClassB方法,Spring首先嘗試從容器中獲取ClassB,此時(shí)ClassB不存在Spring容器中。
- Spring容器初始化ClassB,同時(shí)也會(huì)將ClassB提前暴露到Spring容器中。
- classB調(diào)用setClassA方法,Spring從容器中獲取ClassA ,因?yàn)榈谝徊街幸呀?jīng)提前暴露了ClassA,因此可以獲取到ClassA實(shí)例。
- ClassA通過(guò)spring容器獲取到ClassB,完成了對(duì)象初始化操作。
- 這樣ClassA和ClassB都完成了對(duì)象初始化操作,解決了循環(huán)依賴問(wèn)題。
分享名稱:Spring:SpringIOC循環(huán)依賴問(wèn)題
地址分享:http://fisionsoft.com.cn/article/cddcohc.html


咨詢
建站咨詢
