日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Spring到底是如何解決循環(huán)依賴問題的??

來源: 責編: 時間:2023-11-28 09:33:33 252觀看
導讀作者 | 波哥審校 | 重樓Spring作為當前使用最廣泛的框架之一,其重要性不言而喻。所以充分理解Spring的底層實現(xiàn)原理對于咱們Java程序員來說至關(guān)重要,那么今天筆者就詳細說說Spring框架中一個核心技術(shù)點:如何解決循環(huán)依賴

作者 | 波哥VJo28資訊網(wǎng)——每日最新資訊28at.com

審校 | 重樓VJo28資訊網(wǎng)——每日最新資訊28at.com

Spring作為當前使用最廣泛的框架之一,其重要性不言而喻所以充分理解Spring的底層實現(xiàn)原理對于咱們Java程序員來說至關(guān)重要,那么今天筆者就詳細說說Spring框架中一個核心技術(shù)點:如何解決循環(huán)依賴問題?VJo28資訊網(wǎng)——每日最新資訊28at.com

VJo28資訊網(wǎng)——每日最新資訊28at.com

什么是循環(huán)依賴問題?

Spring的循環(huán)依賴問題是指在使用Spring容器管理Bean的依賴關(guān)系時,出現(xiàn)多個Bean之間相互依賴,形成一個循環(huán)的依賴關(guān)系。這意味著Bean A 依賴于Bean B,同時Bean B 也依賴于Bean A,從而形成一個循環(huán)。Spring容器需要確保這些循環(huán)依賴關(guān)系被正確解決,以避免初始化Bean時出現(xiàn)問題。VJo28資訊網(wǎng)——每日最新資訊28at.com

如果你去網(wǎng)上搜索“Spring是如何解決循環(huán)依賴問題的”,絕大部分答案都是:Spring使用三級緩存確保循環(huán)依賴的解決,包括"singletonObjects"、"earlySingletonObjects"和"singletonFactories"等緩存,以及占位符的使用等等。這當然沒有錯,可是看到這些文章的朋友們,你們真的理解了這其中的原理嗎?還是只是會背答案呢?那么今天筆者就來扒一扒Spring是如何解決這一問題的底層實現(xiàn)原理。當然要明白這個問題的底層實現(xiàn)原理,你得有一定的Spring源碼基礎(chǔ)才行哦。VJo28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在假設(shè)我們有三個類,ClasssA、ClassB、ClassC,代碼如下:VJo28資訊網(wǎng)——每日最新資訊28at.com

VJo28資訊網(wǎng)——每日最新資訊28at.com

下面我們根據(jù)Spring關(guān)于Bean的生命周期管理過程進行分析:VJo28資訊網(wǎng)——每日最新資訊28at.com

假設(shè)首先實例化ClassA我們知道在ClassA實例化完成后,需要填充屬性classB,在填充classB屬性之前,會調(diào)用addSingletonFactory方法,把一個Lambda表達式添加到了singletonFactories集合中,這個Lambda表達式的代碼如下:VJo28資訊網(wǎng)——每日最新資訊28at.com

VJo28資訊網(wǎng)——每日最新資訊28at.com

VJo28資訊網(wǎng)——每日最新資訊28at.com

VJo28資訊網(wǎng)——每日最新資訊28at.com

在填充屬性時,需要獲取到classB的實例對象,也就是說會調(diào)用getBean("classB")來走classB這個bean實例的生命周期流程。VJo28資訊網(wǎng)——每日最新資訊28at.com

在獲取classB實例時首先會調(diào)用getSingleton從singletonObjects獲取(而這個singletonObjects就是我們平常所說的單例池, 其實就是個map集合):VJo28資訊網(wǎng)——每日最新資訊28at.com

VJo28資訊網(wǎng)——每日最新資訊28at.com

VJo28資訊網(wǎng)——每日最新資訊28at.com

如果單例池中沒有才會去創(chuàng)建,那么此時單例池中肯定沒有ClassB的實例,所以針對classB實例也會走一遍創(chuàng)建實例的生命周期的流程,同樣的也會把上述Lambda表達式添加到singletonFactories集合中。VJo28資訊網(wǎng)——每日最新資訊28at.com

此時singletonFactories集合中就有了classA和classB的兩個表達式。VJo28資訊網(wǎng)——每日最新資訊28at.com

但是這里我們要特別注意classB中需要填充屬性classA,所以在填充classB實例的classA屬性時,同樣需要調(diào)用getBean("classA")方法來獲取到classA的實例,在獲取classA實例時,同樣首先會調(diào)用getSingleton從單例池中獲取:VJo28資訊網(wǎng)——每日最新資訊28at.com

VJo28資訊網(wǎng)——每日最新資訊28at.com

如代碼所示,首先會根據(jù)beanName從singletonObjects獲取,也就是獲取classA,很顯然,classA還沒有放到單例池里面去,只有完全創(chuàng)建好的實例才會放到單例池里面去。可以看到代碼同時執(zhí)行
isSingletonCurrentlyInCreation,此時這個方法返回的是true,內(nèi)容如下:VJo28資訊網(wǎng)——每日最新資訊28at.com

VJo28資訊網(wǎng)——每日最新資訊28at.com

那這個isSingletonCurrentlyInCreation方法是干嘛用的呢?看方法名字就知道了,就是判斷當前這個bean是否正在創(chuàng)建中,我們在開始創(chuàng)建classA的時候就已經(jīng)把他的名字添加到singletonsCurrentlyInCreation這個集合中,表明正在創(chuàng)建classA。VJo28資訊網(wǎng)——每日最新資訊28at.com

很顯然滿足了if (singletonObject == null &&isSingletonCurrentlyInCreation(beanName))這個條件,于是就進入到if的方法體中。VJo28資訊網(wǎng)——每日最新資訊28at.com

然后從earlySingletonObjects這個集合中獲取對象,那這個earlySingletonObjects又是個啥玩意?只用singletonFactories和singletonObjects兩個緩存集合不就好了嗎?還要多此一舉使用earlySingletonObjects干啥呢?是不是感覺沒什么用?千萬別這么看,大師們考慮問題比咱們要考慮的周到,不服都不行。VJo28資訊網(wǎng)——每日最新資訊28at.com

我們這個案例中ClassA依賴ClassB和ClassC,ClassB依賴ClassA,ClassC也依賴ClassA,假如我們沒有這個earlySingletonObjects會出現(xiàn)什么情況呢?我們調(diào)用singletonFactories.get(beanName)得到前面說的classA的那個Lambda表達式,然后執(zhí)行
singletonFactory.getObject()就開始執(zhí)行這個Lambda表達式,在填充ClassB中的classA屬性時是不是相當于執(zhí)行了這個Lambda表達式獲取了這個classA對象。VJo28資訊網(wǎng)——每日最新資訊28at.com

好了,到此為止classA中的classB屬性獲取到了,接下來填充classC了,上述同樣的流程,當填充classC的classA屬性時,是不是還得從singletonFactories中獲取classA的Lambda表達式,然后再執(zhí)行那個Lambda表達式,于是執(zhí)行了兩次,正常情況下是沒有問題的,因為兩個Lambda表達式返回的結(jié)果都是classA的實例對象,但是有一種情況下就會有問題了?老鐵們此時心中肯定充滿疑惑,神馬情況呢?VJo28資訊網(wǎng)——每日最新資訊28at.com

如果執(zhí)行這個Lambda表達式返回的是classA的代理對象呢?如果執(zhí)行了兩次,是不是就表明classB中的classA屬性和classC中的classA屬性是兩個不同的對象了?這問題可就大了,那么問題又來了,神馬情況下會返回classA的代理對象?不賣關(guān)子了,直接上答案:在classA需要AOP的情況下,是需要生成代理對象的,而這個生成AOP的騷操作就是在這個Lambda表達式中實現(xiàn)的,我們下面會詳細介紹。VJo28資訊網(wǎng)——每日最新資訊28at.com

所以這里Spring使用了earlySingletonObjects這個我們稱為二級緩存的集合來暫存下,這樣在classC填充classA屬性的時候就不用再次調(diào)用lambda表達式了,是不是完美的解決了上述的問題?剩下的幾行代碼很簡單,就不多廢話了,大家自己看看就知道了。VJo28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)下,Spring解決循環(huán)依賴問題其實就是使用了幾個集合類,它們分別是:singletonsCurrentlyInCreation(SetsingletonFactories(Map)earlySingletonObjects(Map)singletonObjects(Map),通過這幾個集合的相互配合,最終解決循環(huán)依賴問題。VJo28資訊網(wǎng)——每日最新資訊28at.com

作者介紹

波哥,互聯(lián)行業(yè)從業(yè)10余年,先后擔任項目總監(jiān)及架構(gòu)師。目前專攻技術(shù),喜歡研究技術(shù)原理。技術(shù)全面,主攻Java,精通JVM底層機制及Spring全家桶底層框架原理,熟練掌握當前主流的中間件、服務(wù)網(wǎng)格等技術(shù)原理。VJo28資訊網(wǎng)——每日最新資訊28at.com


VJo28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34591-0.htmlSpring到底是如何解決循環(huán)依賴問題的??

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 使用 sync.Cond 來協(xié)調(diào)并發(fā) goroutine 的訪問共享資源

下一篇: 聊聊 Calico BGP容器網(wǎng)絡(luò)實踐

標簽:
  • 熱門焦點
  • 鴻蒙OS 4.0公測機型公布:甚至連nova6都支持

    華為全新的HarmonyOS 4.0操作系統(tǒng)將于今天下午正式登場,官方在發(fā)布會之前也已經(jīng)正式給出了可升級的機型產(chǎn)品,這意味著這些機型會率先支持升級享用。這次的HarmonyOS 4.0支持
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現(xiàn)百度,功能雖然實現(xiàn)了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • “又被陳思誠騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國產(chǎn)懸疑電影,成了陳思誠的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠再度風頭無兩。你可以說陳思誠的
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大“烤”之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報告。ESG是“環(huán)境保
  • 網(wǎng)傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網(wǎng)友@長三角行健者爆料稱,據(jù)經(jīng)銷商集團反饋,小米汽車目前已經(jīng)開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 三星Galaxy Z Fold/Flip 5國行售價曝光 :最低7499元/12999元起

    據(jù)官方此前宣布,三星將于7月26日也就是明天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • AMD的AI芯片轉(zhuǎn)單給三星可能性不大 與臺積電已合作至2nm制程

    據(jù) DIGITIMES 消息,英偉達 AI GPU 出貨逐季飆升,接下來 AMD MI 300 系列將在第 4 季底量產(chǎn)。而半導體業(yè)內(nèi)人士表示,近日傳出 AMD 的 AI 芯片將轉(zhuǎn)單給
  • 超級標準版旗艦!iQOO 11S全球首發(fā)iQOO超算獨顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數(shù)亮相,而下半年即將推出的頂級旗艦已經(jīng)成為了數(shù)碼圈爆料的主流,其中就包括全新的iQOO 11S系
Top 主站蜘蛛池模板: 盐城市| 贺兰县| 武汉市| 盐亭县| 林口县| 罗江县| 平安县| 台东市| 乌苏市| 达拉特旗| 扶余县| 阿巴嘎旗| 蒲江县| 赣榆县| 渭南市| 宁波市| 平塘县| 新宾| 奈曼旗| 上虞市| 香港 | 广宁县| 札达县| 乳山市| 阳东县| 崇阳县| 新兴县| 丽水市| 普陀区| 肇东市| 七台河市| 酒泉市| 昌吉市| 双牌县| 谷城县| 嘉兴市| 宜宾县| 垣曲县| 成都市| 扎鲁特旗| 云浮市|