Spring如何解決循環(huán)依賴

1.什么是循壞依賴
?即循環(huán)引用迈窟,兩個或多個bean相互引用,最終形成一個環(huán)挎塌。如圖:


循環(huán)依賴圖.png

2.什么是循環(huán)調(diào)用
?循環(huán)調(diào)用是方法之間的環(huán)調(diào)用。循環(huán)調(diào)用無法解決内边,除非有終結(jié)條件榴都,否則就是死循環(huán),最終導(dǎo)致內(nèi)存溢出錯誤漠其。

3.構(gòu)造器循環(huán)依賴
?3.1 循環(huán)依賴過程
定義類依賴:

  Class A{
        private B b;
        A(B b){
              this.b = b;
         }
   }

   Class B{
          private C c;
          B(C c){
              this.c = c;
          }
   }

   Class C{
          private A a;
          C(A a){
                this.a = a;
           }
    }

JVM創(chuàng)建對象過程 如下圖所示:


對象創(chuàng)建過程圖.png

3.2 Spring解決構(gòu)造器循環(huán)依賴
?無法解決通過構(gòu)造器注入構(gòu)成的循環(huán)依賴嘴高,只能拋出BeanCurrentylyInCreationException異常表示循環(huán)依賴。
?Spring容器將每一個正在創(chuàng)建的bean標(biāo)識符放在一個“當(dāng)前創(chuàng)建bean池”中和屎,bean表示符在創(chuàng)建過程中將一直保持在這個池中拴驮,因此,如果在創(chuàng)建bean過程中發(fā)現(xiàn)自己已經(jīng)在“當(dāng)前創(chuàng)建bean池”中柴信,將拋出BeanCurrentylyInCreationException異常套啤,表示循環(huán)依賴;對于創(chuàng)建完畢的bean随常,將從“當(dāng)前創(chuàng)建bean池”中清除掉潜沦。

4.setter循環(huán)依賴
?通過Spring容器提前暴露剛完成構(gòu)造器注入但未完成其他步驟(如setter注入)的bean來完成的。通過提前暴露一個單例工廠方法绪氛,從而使其他bean能夠引用到該bean唆鸡。
?注:只能解決單例作用域的bean循環(huán)依賴。
?具體步驟:
?(1)Spring容器創(chuàng)建單例 a bean枣察,首先根據(jù)無參構(gòu)造器創(chuàng)建bean争占,并暴露一個“ObjectFactory”,用于返回一個提前暴露一個創(chuàng)建中的bean序目,并將 “a”標(biāo)識符放到“當(dāng)前創(chuàng)建bean池”臂痕,然后進(jìn)行setter注入b;
?(2)Spring容器創(chuàng)建單例 b bean,首先根據(jù)無參構(gòu)造器創(chuàng)建bean猿涨,并暴露一個“ObjectFactory”刻蟹,用于返回一個提前暴露一個創(chuàng)建中的bean,并將 “b”標(biāo)識符放到“當(dāng)前創(chuàng)建bean池”嘿辟,然后進(jìn)行setter注入c;
?(3)Spring容器創(chuàng)建單例 c bean舆瘪,首先根據(jù)無參構(gòu)造器創(chuàng)建bean片效,并暴露一個“ObjectFactory”,用于返回一個提前暴露一個創(chuàng)建中的bean英古,并將 “c”標(biāo)識符放到“當(dāng)前創(chuàng)建bean池”淀衣,然后進(jìn)行setter注入a;進(jìn)行注入"a"時,由于提前暴露了“ObjectFactory”工廠召调,從而使用它返回提前暴露一個創(chuàng)建中的bean膨桥。
?(4)最后在依賴注入“b”和“a”,完成setter注入唠叛。

另附個人覺得講的非常明白的一篇博客:
https://blog.csdn.net/qq_36381855/article/details/79752689

注:參考《Spring深度解析》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末只嚣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子艺沼,更是在濱河造成了極大的恐慌册舞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件障般,死亡現(xiàn)場離奇詭異调鲸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挽荡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門藐石,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人定拟,你說我怎么就攤上這事于微。” “怎么了青自?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵角雷,是天一觀的道長。 經(jīng)常有香客問我性穿,道長勺三,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任需曾,我火速辦了婚禮吗坚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呆万。我一直安慰自己商源,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布谋减。 她就那樣靜靜地躺著牡彻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庄吼,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天缎除,我揣著相機(jī)與錄音,去河邊找鬼总寻。 笑死器罐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渐行。 我是一名探鬼主播轰坊,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祟印!你這毒婦竟也來了肴沫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蕴忆,失蹤者是張志新(化名)和其女友劉穎颤芬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孽文,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年夺艰,在試婚紗的時候發(fā)現(xiàn)自己被綠了芋哭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡郁副,死狀恐怖减牺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情存谎,我是刑警寧澤拔疚,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站既荚,受9級特大地震影響稚失,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恰聘,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一句各、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晴叨,春花似錦凿宾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孙技,卻和暖如春产禾,著一層夾襖步出監(jiān)牢的瞬間排作,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工下愈, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留纽绍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓势似,卻偏偏與公主長得像拌夏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子履因,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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