您好,登錄后才能下訂單哦!
請(qǐng)求超時(shí)!
這篇文章主要講解了“spring要怎么解決循環(huán)依賴”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“spring要怎么解決循環(huán)依賴”吧!
先說結(jié)論,spring通過三級(jí)緩存機(jī)制來解決循環(huán)依賴問題,構(gòu)造器依賴除外,即構(gòu)造器注入可能會(huì)報(bào)錯(cuò)。
循環(huán)依賴的情況如下:
首先spring初始化bean的步驟如下:
這里只需要簡(jiǎn)單的理解為只需要三步:
實(shí)例化
填充屬性(注入依賴)
初始化完成
spring在創(chuàng)建Bean A的時(shí)候會(huì)先去一級(jí)緩存(singletonObjects),如果一級(jí)緩存沒有則再?gòu)亩?jí)緩存(earlySingletonObjects)中獲取,如果二級(jí)緩存也沒有,則再?gòu)娜?jí)緩存(singletonFactories)中獲取,如果還獲取不到,則實(shí)例化一個(gè)A,然后放入三級(jí)緩存,然后填充屬性,此刻發(fā)現(xiàn)依賴B,于是創(chuàng)建B,同樣的經(jīng)過上述步驟,由于每級(jí)緩存都獲取不到,于是實(shí)例化B,然后填充屬性,發(fā)現(xiàn)依賴A,然后依次去每級(jí)緩存中獲取,由于三級(jí)緩存中已經(jīng)有一個(gè)A,于是B可以順利注入依賴,并被正確的初始化,然后遞歸返回,于是A也可以被正確的初始化了。
通過上述說明,可以看出bean都是需要可以先被實(shí)例化才可以的,所以這也就是為什么構(gòu)造器依賴可能會(huì)失敗的原因。假如A構(gòu)造器依賴B,因?yàn)閷?shí)例化A需要先調(diào)用A的構(gòu)造函數(shù),發(fā)現(xiàn)依賴B,那么需要去初始化B,但是B也依賴A,不管B是通過構(gòu)造器注入還是setter注入,此時(shí)由于A沒有被實(shí)例化,沒有放入三級(jí)緩存,所以B無法被初始化,所以spring會(huì)直接報(bào)錯(cuò)。反之,如果A通過setter注入的話,那么則可以通過構(gòu)造函數(shù)先實(shí)例化,放入緩存,然后再填充屬性,這樣的話不管B是通過setter還是構(gòu)造器注入A,都能在緩存中獲取到,于是可以初始化。
由此可見,循環(huán)依賴中,如果spring先去創(chuàng)建的bean通過構(gòu)造器注入另一個(gè)bean則會(huì)失敗,反之則可以成功。所以這也是為什么一定不好通過構(gòu)造器注入的原因。
感謝各位的閱讀,以上就是“spring要怎么解決循環(huán)依賴”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)spring要怎么解決循環(huán)依賴這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。
億速云公眾號(hào)
手機(jī)網(wǎng)站二維碼
Copyright ? Yisu Cloud Ltd. All Rights Reserved. 2018 版權(quán)所有
廣州億速云計(jì)算有限公司粵ICP備17096448號(hào)-1 粵公網(wǎng)安備 44010402001142號(hào)增值電信業(yè)務(wù)經(jīng)營(yíng)許可證編號(hào):B1-20181529