????????循環(huán)依賴(lài):A對(duì)象中有B屬性。B對(duì)象中有A屬性。比如:丈夫類(lèi)Husband,妻子類(lèi)Wife。Husband中有Wife的引用。Wife中有Husband的引用。
? ? ? ? 解決:至少一個(gè)類(lèi)采用set注入?+ singleton模式。
? ? ? ? 原因:這種方式可以做到將“實(shí)例化Bean”和“給Bean屬性賦值”這兩個(gè)動(dòng)作分開(kāi)去完成。調(diào)用無(wú)參構(gòu)造實(shí)例化Bean對(duì)象,可以先不賦值提前將該Bean對(duì)象“曝光”給外界,然后調(diào)用setter方法來(lái)完成賦值。我們可以先把所有的單例Bean實(shí)例化出來(lái),放到一個(gè)集合當(dāng)中(我們可以稱(chēng)之為緩存),所有的單例Bean全部實(shí)例化完成之后,以后我們?cè)俾恼{(diào)用setter方法給屬性賦值。這樣就解決了循環(huán)依賴(lài)的問(wèn)題。
? ? ? ? 從源碼層分析:
Cache of singleton objects: bean name to bean instance. 單例對(duì)象的緩存:key存儲(chǔ)bean名稱(chēng),value存儲(chǔ)Bean對(duì)象【一級(jí)緩存】
Cache of early singleton objects: bean name to bean instance. 早期單例對(duì)象的緩存:key存儲(chǔ)bean名稱(chēng),value存儲(chǔ)早期的Bean對(duì)象【二級(jí)緩存】
Cache of singleton factories: bean name to ObjectFactory. 單例工廠緩存:key存儲(chǔ)bean名稱(chēng),value存儲(chǔ)該Bean對(duì)應(yīng)的ObjectFactory對(duì)象【三級(jí)緩存】
這個(gè)方法的作用是:將創(chuàng)建Bean對(duì)象的ObjectFactory對(duì)象提前曝光。
從源碼中可以看到,spring會(huì)先從一級(jí)緩存中獲取Bean,如果獲取不到,則從二級(jí)緩存中獲取Bean,如果二級(jí)緩存還是獲取不到,則從三級(jí)緩存中獲取之前曝光的ObjectFactory對(duì)象,通過(guò)ObjectFactory對(duì)象獲取Bean實(shí)例,這樣就解決了循環(huán)依賴(lài)的問(wèn)題。
總結(jié):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-859016.html
????????Spring只能解決setter方法注入的單例bean之間的循環(huán)依賴(lài)。ClassA依賴(lài)ClassB,ClassB又依賴(lài)ClassA,形成依賴(lài)閉環(huán)。Spring在創(chuàng)建ClassA對(duì)象后,不需要等給屬性賦值,直接將其曝光到bean緩存當(dāng)中。在解析ClassA的屬性時(shí),又發(fā)現(xiàn)依賴(lài)于ClassB,再次去獲取ClassB,當(dāng)解析ClassB的屬性時(shí),又發(fā)現(xiàn)需要ClassA的屬性,但此時(shí)的ClassA已經(jīng)被提前曝光加入了正在創(chuàng)建的bean的緩存中,則無(wú)需創(chuàng)建新的的ClassA的實(shí)例,直接從緩存中獲取即可。從而解決循環(huán)依賴(lài)問(wèn)題。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-859016.html
到了這里,關(guān)于【spring6】解決循環(huán)依賴(lài)的機(jī)理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!