Spring 三種方式的循環(huán)依賴

循環(huán)依賴是指多個類循環(huán)嵌套引用胎挎,如:A類引用B類泵额,B類引用C類挟冠,C類引用A類。

第一種:構(gòu)造器參數(shù)循環(huán)依賴

Spring容器會將每一個正在創(chuàng)建的Bean標(biāo)識放在一個“當(dāng)前創(chuàng)建Bean池中巩梢,Bean標(biāo)識符在創(chuàng)建過程中將一直保持在這個池中创泄。
如果在創(chuàng)建Bean過程中發(fā)現(xiàn)自己已經(jīng)在“當(dāng)前創(chuàng)建Bean池”里時將拋出BeanCurrentlyInCreationException異常表示循環(huán)依賴;而創(chuàng)建完成的Bean將從“當(dāng)前創(chuàng)建Bean池”中清除掉且改。

看如下實例:



看配置文件的構(gòu)造器參數(shù)配置:
<bean id="a" class="com.soecode.lyf.test.StudentA" >
? ?<constructor-arg index="0" ref="b"/>
</bean>

<bean id="b" class="com.soecode.lyf.test.StudentB" >
?????<constructor-arg index="0" ref="c" >
</bean>

<bean id="c" class="com.soecode.lyf.test.StudentC" >
?????<constructor-arg index="0" ref="a" >
</bean>

這三個就是StudentA類中有StudentB類验烧,StudentB類中有StudentC類,StudentC類中有StudentA類又跛。

第二種:setter方式單列碍拆,默認(rèn)方式


看如下實例:


setter 方式注入 scope默認(rèn)為singleton
<bean id="a" class="com.soecode.lyf.test.StudentA" >
????<property name="studentB" ref="b">
</bean>

<bean id="b" class="com.soecode.lyf.test.StudentB" >
????<property name="studentC" ref="c" >
</bean>

<bean id="c" class="com.soecode.lyf.test.StudentC" >
????<property name="studentA" ref="a" >
</bean>
執(zhí)行結(jié)果:


為什么用setter方式就不報錯了呢?
/**?Cache?of?singleton?factories:?bean?name?-->?ObjectFactory(單例的工廠Bean緩存集合)?*/慨蓝、privatefinalMap?singletonFactories?=newHashMap(16);

1.創(chuàng)建StudentA a單列時感混,首先無參構(gòu)造創(chuàng)建,并暴露到singletonFactories中礼烈,并將a 標(biāo)志符放到當(dāng)前正在創(chuàng)建Bean池, 然后進(jìn)行setter出入StudentB b弧满。
2.創(chuàng)建StudentB b單列時,首先無參構(gòu)造創(chuàng)建此熬,并暴露到singletonFactories中庭呜,并將b 標(biāo)志符放到當(dāng)前正在創(chuàng)建Bean池, 然后進(jìn)行setter出入StudentC c。
3.創(chuàng)建StudentC c單列時犀忱,首先無參構(gòu)造創(chuàng)建募谎,并暴露到singletonFactories中,并將b 標(biāo)志符放到當(dāng)前正在創(chuàng)建Bean池, 然后進(jìn)行setter出入StudentA a阴汇。在注入 a 時数冬,由于提前暴露在singletonFactories集合中了,利用它就可以取到 a 正在創(chuàng)建的Bean對象搀庶。
4. 最后依賴注入StudentB拐纱、StudentA

第三種:setter方式 原型注入

看配置文件:

scope=”property“ 意思是每一次請求都會創(chuàng)建一個實例對象铜异。
兩者的區(qū)別是:有狀態(tài)的bean都使用property作用域,無狀態(tài)的一般都使用singleton單列作用域秸架。

看運行之后的控制臺輸出:


總結(jié):為什么setter方式 singleton單列會成功揍庄,而setter方式 property原型會報BeanCurrentlyInCreationException?

因為單列的時候咕宿,會將bean放在緩存中币绩,可以提前暴露此接口。
而property原型不會放入緩存中府阀,無法提前暴露缆镣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市试浙,隨后出現(xiàn)的幾起案子董瞻,更是在濱河造成了極大的恐慌,老刑警劉巖田巴,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钠糊,死亡現(xiàn)場離奇詭異,居然都是意外死亡壹哺,警方通過查閱死者的電腦和手機抄伍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來管宵,“玉大人截珍,你說我怎么就攤上這事÷崞樱” “怎么了岗喉?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炸庞。 經(jīng)常有香客問我钱床,道長,這世上最難降的妖魔是什么埠居? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任查牌,我火速辦了婚禮,結(jié)果婚禮上滥壕,老公的妹妹穿的比我還像新娘僧免。我一直安慰自己,他們只是感情好捏浊,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撞叨,像睡著了一般金踪。 火紅的嫁衣襯著肌膚如雪浊洞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天胡岔,我揣著相機與錄音法希,去河邊找鬼。 笑死靶瘸,一個胖子當(dāng)著我的面吹牛苫亦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怨咪,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼屋剑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诗眨?” 一聲冷哼從身側(cè)響起唉匾,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匠楚,沒想到半個月后巍膘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡芋簿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年峡懈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片与斤。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡肪康,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幽告,到底是詐尸還是另有隱情梅鹦,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布冗锁,位于F島的核電站齐唆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冻河。R本人自食惡果不足惜箍邮,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叨叙。 院中可真熱鬧锭弊,春花似錦、人聲如沸擂错。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剑鞍,卻和暖如春昨凡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚁署。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工便脊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人光戈。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓哪痰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親久妆。 傳聞我的和親對象是個殘疾皇子晌杰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容