偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開發(fā) 前端
為了解決這些問題,Spring引入了三級緩存機(jī)制。三級緩存在二級緩存的基礎(chǔ)上增加了一個緩存階段,即earlySingletonObjects,用于存儲已經(jīng)創(chuàng)建但尚未完成初始化的Bean實(shí)例。通過這樣的設(shè)計,Spring能夠更好地管理Bean的創(chuàng)建過程,確保循環(huán)依賴不會導(dǎo)致程序出現(xiàn)異常。

引言

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

圖片圖片

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

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

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

Spring中循環(huán)依賴場景

在Spring框架中,循環(huán)依賴是指兩個或多個Bean之間存在相互依賴的情況,這在日常開發(fā)中是比較常見的。下面我們來詳細(xì)了解一下在Spring中的循環(huán)依賴場景以及可能的解決方案。

首先,讓我們看看Spring中幾種典型的循環(huán)依賴場景:

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

以上這些場景都有可能導(dǎo)致Spring容器在初始化Bean時出現(xiàn)循環(huán)依賴的情況,從而引發(fā)一系列問題,比如Bean無法正常初始化、內(nèi)存溢出等。

其中,構(gòu)造器的循環(huán)依賴問題無法解決,在解決屬性循環(huán)依賴時,可以使用懶加載,spring采用的是提前暴露對象的方法。

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

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

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

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

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

三級緩存是Spring框架用來解決循環(huán)依賴問題的重要機(jī)制之一。在面對循環(huán)依賴的情況下,Spring會使用三級緩存來管理Bean的創(chuàng)建過程,確保循環(huán)依賴不會導(dǎo)致程序出現(xiàn)異常或無限遞歸。

這個機(jī)制涉及到三個緩存階段:singletonObjects、earlySingletonObjects和singletonFactories。

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

當(dāng)另一個Bean依賴正在創(chuàng)建的Bean時,Spring會先從singletonObjects緩存中嘗試獲取Bean的實(shí)例,如果獲取不到,則會從earlySingletonObjects緩存中獲取。如果依然無法獲取到,則說明Bean還未完全初始化,此時Spring會檢查singletonFactories緩存中是否有正在創(chuàng)建的Bean的工廠實(shí)例。如果有,則會等待Bean的完全初始化,從而解決循環(huán)依賴。

如果檢測到循環(huán)依賴無法解決,Spring會拋出相應(yīng)的異常,比如BeanCurrentlyInCreationException,通知開發(fā)者存在循環(huán)依賴問題。

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

為什么是三級緩存而不是二級?

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

然而,如果僅僅使用二級緩存,可能會遇到一些問題。主要有以下幾個方面:

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

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


責(zé)任編輯:武曉燕 來源: 知其然亦知其所以然
相關(guān)推薦

2025-03-17 00:21:00

2024-06-05 11:43:10

2023-10-07 08:35:07

依賴注入Spring

2021-05-06 07:58:57

Spring BeanIOCAOP

2023-09-28 08:15:05

SpringBean加載

2023-05-04 08:06:27

Spring循環(huán)依賴

2020-02-10 15:50:18

Spring循環(huán)依賴Java

2019-11-26 14:30:20

Spring循環(huán)依賴Java

2011-04-02 15:25:41

Spring

2021-09-01 11:45:10

Spring循環(huán)依賴面試

2020-12-29 08:34:08

spring循環(huán)依賴開發(fā)

2025-04-29 08:00:36

2024-04-12 07:51:05

SpringBean初始化

2020-07-29 10:40:21

Spring循環(huán)依賴Java

2020-05-07 10:05:58

Spring循環(huán)依賴Java

2021-06-25 09:47:59

Spring循環(huán)依賴Java

2019-09-09 06:30:06

Springboot程序員開發(fā)

2023-10-07 08:40:57

緩存屬性Spring

2021-10-21 08:31:31

Spring循環(huán)依賴面試

2024-08-27 11:00:56

單例池緩存bean
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號