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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

想進(jìn)阿里?先搞懂Spring Bean的循環(huán)依賴!

來(lái)源: 責(zé)編: 時(shí)間:2024-03-18 09:38:37 168觀看
導(dǎo)讀引言嗨,小伙伴們!我是小米,你們的技術(shù)分享小助手!今天我們要聊的話題可是技術(shù)圈內(nèi)頗為熱門(mén)的“阿里巴巴面試題:Spring的循環(huán)依賴”哦!相信很多小伙伴都會(huì)在技術(shù)面試中遇到類似的問(wèn)題,沒(méi)錯(cuò),循環(huán)依賴是一個(gè)挑戰(zhàn)性很高的問(wèn)題,但是

引言

嗨,小伙伴們!我是小米,你們的技術(shù)分享小助手!今天我們要聊的話題可是技術(shù)圈內(nèi)頗為熱門(mén)的“阿里巴巴面試題:Spring的循環(huán)依賴”哦!相信很多小伙伴都會(huì)在技術(shù)面試中遇到類似的問(wèn)題,沒(méi)錯(cuò),循環(huán)依賴是一個(gè)挑戰(zhàn)性很高的問(wèn)題,但是只要你掌握了相關(guān)知識(shí),就能夠游刃有余地解決它。那么,讓我們一起來(lái)深入了解一下吧!zrD28資訊網(wǎng)——每日最新資訊28at.com

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

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

循環(huán)依賴,作為軟件開(kāi)發(fā)中常見(jiàn)的問(wèn)題之一,指的是兩個(gè)或多個(gè)組件之間形成了相互依賴的關(guān)系,最終形成一個(gè)循環(huán)。在編程領(lǐng)域中,這種情況可能會(huì)導(dǎo)致程序運(yùn)行時(shí)出現(xiàn)一系列難以預(yù)料的問(wèn)題,比如死鎖、無(wú)限遞歸等。zrD28資訊網(wǎng)——每日最新資訊28at.com

循環(huán)依賴通常出現(xiàn)在對(duì)象之間相互引用的場(chǎng)景中。舉個(gè)簡(jiǎn)單的例子,假設(shè)有兩個(gè)類A和B,A中引用了B,而B(niǎo)中又引用了A,這樣就形成了循環(huán)依賴。在實(shí)際開(kāi)發(fā)中,循環(huán)依賴可能會(huì)導(dǎo)致程序的初始化順序混亂,或者造成內(nèi)存泄漏等問(wèn)題。zrD28資訊網(wǎng)——每日最新資訊28at.com

Spring中循環(huán)依賴場(chǎng)景zrD28資訊網(wǎng)——每日最新資訊28at.com

在Spring框架中,循環(huán)依賴是指兩個(gè)或多個(gè)Bean之間存在相互依賴的情況,這在日常開(kāi)發(fā)中是比較常見(jiàn)的。下面我們來(lái)詳細(xì)了解一下在Spring中的循環(huán)依賴場(chǎng)景以及可能的解決方案。zrD28資訊網(wǎng)——每日最新資訊28at.com

首先,讓我們看看Spring中幾種典型的循環(huán)依賴場(chǎng)景:zrD28資訊網(wǎng)——每日最新資訊28at.com

  • Prototype原型Bean循環(huán)依賴:當(dāng)一個(gè)Bean的作用域?yàn)閜rototype(原型)時(shí),Spring容器在初始化時(shí)會(huì)為每次請(qǐng)求創(chuàng)建一個(gè)新的實(shí)例。如果兩個(gè)prototype Bean相互依賴,那么就會(huì)出現(xiàn)循環(huán)依賴的情況。
  • 構(gòu)造器的循環(huán)依賴(構(gòu)造器注入):在構(gòu)造器注入中,如果Bean A依賴于Bean B,而B(niǎo)ean B又依賴于Bean A,那么就會(huì)形成構(gòu)造器的循環(huán)依賴。
  • Field屬性的循環(huán)依賴(set注入):在使用set方法進(jìn)行屬性注入時(shí),如果兩個(gè)Bean相互依賴,也會(huì)導(dǎo)致循環(huán)依賴的問(wèn)題。

以上這些場(chǎng)景都有可能導(dǎo)致Spring容器在初始化Bean時(shí)出現(xiàn)循環(huán)依賴的情況,從而引發(fā)一系列問(wèn)題,比如Bean無(wú)法正常初始化、內(nèi)存溢出等。zrD28資訊網(wǎng)——每日最新資訊28at.com

其中,構(gòu)造器的循環(huán)依賴問(wèn)題無(wú)法解決,在解決屬性循環(huán)依賴時(shí),可以使用懶加載,spring采用的是提前暴露對(duì)象的方法。zrD28資訊網(wǎng)——每日最新資訊28at.com

懶加載解決循環(huán)依賴問(wèn)題

懶加載(Lazy initialization)是Spring框架提供的一種解決循環(huán)依賴問(wèn)題的有效策略之一,其中通過(guò)使用@Lazy注解來(lái)延遲Bean的初始化過(guò)程。在循環(huán)依賴的情況下,如果兩個(gè)Bean相互依賴,可能會(huì)導(dǎo)致初始化過(guò)程中出現(xiàn)死鎖或無(wú)限遞歸等問(wèn)題。通過(guò)懶加載的方式,Spring容器會(huì)將Bean的初始化推遲到第一次被調(diào)用時(shí)才進(jìn)行,從而避免了循環(huán)依賴導(dǎo)致的初始化問(wèn)題。zrD28資訊網(wǎng)——每日最新資訊28at.com

舉例來(lái)說(shuō),假設(shè)我們有兩個(gè)Bean:Bean A 和 Bean B,它們相互依賴。通過(guò)在Bean的定義中添加@Lazy注解,告訴Spring容器在初始化時(shí)不要立即創(chuàng)建Bean的實(shí)例,而是等到需要使用該Bean時(shí)再進(jìn)行初始化。這樣可以確保Bean在初始化過(guò)程中不會(huì)出現(xiàn)循環(huán)依賴的問(wèn)題。zrD28資訊網(wǎng)——每日最新資訊28at.com

雖然懶加載能夠有效解決循環(huán)依賴問(wèn)題,但也需要注意一些潛在的性能影響。因?yàn)槊看问褂肂ean時(shí)都需要進(jìn)行初始化,所以可能會(huì)增加一定的延遲和資源消耗。因此,在使用懶加載時(shí)需要根據(jù)具體情況權(quán)衡考慮,選擇合適的解決方案。zrD28資訊網(wǎng)——每日最新資訊28at.com

三級(jí)緩存解決循環(huán)依賴問(wèn)題

三級(jí)緩存是Spring框架用來(lái)解決循環(huán)依賴問(wèn)題的重要機(jī)制之一。在面對(duì)循環(huán)依賴的情況下,Spring會(huì)使用三級(jí)緩存來(lái)管理Bean的創(chuàng)建過(guò)程,確保循環(huán)依賴不會(huì)導(dǎo)致程序出現(xiàn)異常或無(wú)限遞歸。zrD28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)機(jī)制涉及到三個(gè)緩存階段:singletonObjects、earlySingletonObjects和singletonFactories。zrD28資訊網(wǎng)——每日最新資訊28at.com

首先,當(dāng)Spring容器創(chuàng)建Bean時(shí),會(huì)將正在創(chuàng)建的Bean放入singletonFactories緩存中。接著,Spring會(huì)調(diào)用Bean的構(gòu)造函數(shù)創(chuàng)建實(shí)例,并將實(shí)例放入earlySingletonObjects緩存中,此時(shí)Bean還未完全初始化,可能存在一些未完成的依賴。最后,Spring會(huì)完成Bean的初始化,解決所有的依賴關(guān)系,并將完全初始化的Bean放入singletonObjects緩存中。zrD28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)另一個(gè)Bean依賴正在創(chuàng)建的Bean時(shí),Spring會(huì)先從singletonObjects緩存中嘗試獲取Bean的實(shí)例,如果獲取不到,則會(huì)從earlySingletonObjects緩存中獲取。如果依然無(wú)法獲取到,則說(shuō)明Bean還未完全初始化,此時(shí)Spring會(huì)檢查singletonFactories緩存中是否有正在創(chuàng)建的Bean的工廠實(shí)例。如果有,則會(huì)等待Bean的完全初始化,從而解決循環(huán)依賴。zrD28資訊網(wǎng)——每日最新資訊28at.com

如果檢測(cè)到循環(huán)依賴無(wú)法解決,Spring會(huì)拋出相應(yīng)的異常,比如BeanCurrentlyInCreationException,通知開(kāi)發(fā)者存在循環(huán)依賴問(wèn)題。zrD28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)三級(jí)緩存機(jī)制,Spring能夠在容器初始化過(guò)程中管理Bean的創(chuàng)建順序,并確保循環(huán)依賴不會(huì)導(dǎo)致程序出現(xiàn)異常。但是需要注意的是,過(guò)多的循環(huán)依賴可能會(huì)導(dǎo)致性能下降,因此在設(shè)計(jì)應(yīng)用程序時(shí)應(yīng)盡量避免過(guò)多的循環(huán)依賴。zrD28資訊網(wǎng)——每日最新資訊28at.com

為什么是三級(jí)緩存而不是二級(jí)?

你可能會(huì)好奇為什么Spring使用了三級(jí)緩存而不是二級(jí)。首先,讓我們來(lái)理解一下什么是二級(jí)緩存。在二級(jí)緩存的情況下,Spring容器會(huì)將正在創(chuàng)建的Bean實(shí)例放入一個(gè)緩存中,用于管理正在創(chuàng)建的Bean。當(dāng)另一個(gè)Bean需要引用正在創(chuàng)建的Bean時(shí),容器會(huì)先從這個(gè)緩存中嘗試獲取Bean的實(shí)例,以解決循環(huán)依賴的問(wèn)題。zrD28資訊網(wǎng)——每日最新資訊28at.com

然而,如果僅僅使用二級(jí)緩存,可能會(huì)遇到一些問(wèn)題。主要有以下幾個(gè)方面:zrD28資訊網(wǎng)——每日最新資訊28at.com

  • 無(wú)法區(qū)分未完成和已完成的Bean實(shí)例:二級(jí)緩存中存儲(chǔ)的是正在創(chuàng)建的Bean實(shí)例,但無(wú)法區(qū)分哪些Bean已經(jīng)完成了初始化,哪些Bean還處于未完成狀態(tài)。這可能導(dǎo)致容器無(wú)法正確處理循環(huán)依賴,因?yàn)闊o(wú)法確定依賴的Bean是否已經(jīng)初始化完成。
  • 缺乏針對(duì)性的解決方案:二級(jí)緩存只能暫存正在創(chuàng)建的Bean實(shí)例,無(wú)法提供針對(duì)性的解決方案來(lái)處理循環(huán)依賴。在復(fù)雜的場(chǎng)景下,可能需要更多的信息來(lái)判斷和解決循環(huán)依賴問(wèn)題。

因此,為了解決這些問(wèn)題,Spring引入了三級(jí)緩存機(jī)制。三級(jí)緩存在二級(jí)緩存的基礎(chǔ)上增加了一個(gè)緩存階段,即earlySingletonObjects,用于存儲(chǔ)已經(jīng)創(chuàng)建但尚未完成初始化的Bean實(shí)例。通過(guò)這樣的設(shè)計(jì),Spring能夠更好地管理Bean的創(chuàng)建過(guò)程,確保循環(huán)依賴不會(huì)導(dǎo)致程序出現(xiàn)異常。zrD28資訊網(wǎng)——每日最新資訊28at.com


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

本文鏈接:http://www.www897cc.com/showinfo-26-76495-0.html想進(jìn)阿里?先搞懂Spring Bean的循環(huán)依賴!

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

上一篇: RabbitMQ代碼篇之過(guò)期時(shí)間,死信隊(duì)列,延遲隊(duì)列,優(yōu)先級(jí)隊(duì)列的基本使用

下一篇: 還在用Calendar操作Date?Java8都被放棄了,你還不知道Java8中全新的日期時(shí)間API

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 主站蜘蛛池模板: 泸州市| 偃师市| 寿阳县| 萨嘎县| 亚东县| 海丰县| 宜阳县| 舟曲县| 那坡县| 田阳县| 万宁市| 五河县| 长子县| 旬邑县| 岢岚县| 上思县| 中超| 凯里市| 日土县| 武义县| 车险| 阜阳市| 磐安县| 稷山县| 三门峡市| 南城县| 保靖县| 米泉市| 手游| 云梦县| 南投县| 泽州县| 武威市| 微山县| 清远市| 安多县| 庐江县| 民丰县| 咸丰县| 田阳县| 巫山县|