最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的循環(huán)依賴問(wèn)題

 更新時(shí)間:2024年09月18日 14:19:41   作者:拾木200  
在Spring框架中,循環(huán)依賴是指兩個(gè)或多個(gè)Bean相互依賴,這導(dǎo)致在Bean的創(chuàng)建過(guò)程中出現(xiàn)依賴死鎖,為了解決這一問(wèn)題,Spring引入了三級(jí)緩存機(jī)制,包括singletonObjects、earlySingletonObjects和singletonFactories

在 Spring 中,循環(huán)依賴是指兩個(gè)或多個(gè) Bean 相互依賴,導(dǎo)致在創(chuàng)建過(guò)程中出現(xiàn)了依賴死鎖的問(wèn)題。

為了解決循環(huán)依賴,Spring 引入了三級(jí)緩存機(jī)制。

了解為什么需要三級(jí)緩存機(jī)制,首先要明白循環(huán)依賴是如何發(fā)生的,以及兩級(jí)緩存為什么不足夠。

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

假設(shè)有兩個(gè) Bean AB

  • A 依賴于 B
  • B 依賴于 A

如果沒(méi)有緩存機(jī)制,Spring 在創(chuàng)建 A 時(shí)會(huì)發(fā)現(xiàn)它需要 B,于是去創(chuàng)建 B,但在創(chuàng)建 B 時(shí)又發(fā)現(xiàn)需要 A,這時(shí)就會(huì)產(chǎn)生循環(huán)依賴,最終導(dǎo)致棧溢出或拋出異常。

二、三級(jí)緩存機(jī)制

Spring 使用三級(jí)緩存(三級(jí)依賴處理機(jī)制)來(lái)解決循環(huán)依賴問(wèn)題,分別是:

一級(jí)緩存singletonObjects

  • 用于存儲(chǔ)完全初始化好的單例對(duì)象。
  • 完全初始化后的 Bean 會(huì)放入一級(jí)緩存中,表示該 Bean 已經(jīng)準(zhǔn)備好可以使用了。

二級(jí)緩存earlySingletonObjects

  • 用于存儲(chǔ)提前暴露的 Bean,主要是尚未完成依賴注入但已經(jīng)實(shí)例化的 Bean。
  • 這個(gè)緩存用于提前暴露尚未完成初始化的 Bean,防止循環(huán)依賴無(wú)法解決。通常情況下,如果某個(gè) Bean 已經(jīng)實(shí)例化但還沒(méi)有完成后續(xù)的屬性填充等操作,它會(huì)存放在這個(gè)緩存中。

三級(jí)緩存singletonFactories

  • 用于存儲(chǔ) Bean 的 ObjectFactory(對(duì)象工廠),這個(gè)工廠提供對(duì)該 Bean 的代理對(duì)象(比如 AOP 代理對(duì)象)的創(chuàng)建邏輯。
  • 三級(jí)緩存的存在使得 Spring 可以在 Bean 創(chuàng)建的早期階段將未完全初始化的 Bean 提供出來(lái),尤其是代理對(duì)象。這樣即使 Bean 還沒(méi)有完成依賴注入,也能通過(guò)工廠獲得它的一個(gè)早期引用。

三、為什么需要三級(jí)緩存??jī)杉?jí)不行嗎?

假如只使用一級(jí)緩存和二級(jí)緩存:

  • 一級(jí)緩存只存儲(chǔ)已經(jīng)完全初始化好的 Bean,顯然無(wú)法解決循環(huán)依賴問(wèn)題,因?yàn)?Bean 尚未完成初始化時(shí)無(wú)法放入一級(jí)緩存。
  • 二級(jí)緩存則存儲(chǔ)提前暴露的 Bean,但這通常是直接的原始對(duì)象,而不是代理對(duì)象。如果應(yīng)用了 AOP 或者需要?jiǎng)?chuàng)建代理對(duì)象的場(chǎng)景中,依賴的 Bean 如果在循環(huán)依賴中被提前暴露時(shí),可能無(wú)法應(yīng)用正確的代理。

三級(jí)緩存 允許通過(guò) ObjectFactory 這種延遲加載的方式,在需要的時(shí)候創(chuàng)建早期引用,包括創(chuàng)建代理對(duì)象。這確保了即使在循環(huán)依賴中,Spring 也可以在合適的時(shí)間點(diǎn)創(chuàng)建完整的代理對(duì)象,而不是僅僅提供原始對(duì)象。

總結(jié)

三級(jí)緩存機(jī)制的關(guān)鍵點(diǎn)在于:

  • 二級(jí)緩存不能解決 Bean 代理的問(wèn)題,特別是在涉及到 AOP 的情況下。
  • 三級(jí)緩存通過(guò)引入 ObjectFactory,可以確保在代理場(chǎng)景下也能處理循環(huán)依賴,提前暴露還未完全初始化的代理對(duì)象。

因此,兩級(jí)緩存不足以解決所有循環(huán)依賴問(wèn)題,特別是在涉及到代理對(duì)象的情況下,三級(jí)緩存的機(jī)制顯得非常必要。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot五種獲取ApplicationContext的實(shí)現(xiàn)方式

    SpringBoot五種獲取ApplicationContext的實(shí)現(xiàn)方式

    本文系統(tǒng)梳理了獲取Spring ApplicationContext的多種方式,包括創(chuàng)建工具類、實(shí)現(xiàn)ApplicationContextInitializer接口、ApplicationListener接口、啟動(dòng)類配置、ApplicationContextAware接口及@Resource注解注入,提供便捷的bean獲取與容器操作方案
    2025-09-09
  • Mybatis自定義typeHandle過(guò)程解析

    Mybatis自定義typeHandle過(guò)程解析

    這篇文章主要介紹了Mybatis自定義typeHandle過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java后端進(jìn)行跨域的幾種方式小結(jié)

    java后端進(jìn)行跨域的幾種方式小結(jié)

    本文主要介紹了java后端進(jìn)行跨域的幾種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • spring boot利用docker構(gòu)建gradle項(xiàng)目的實(shí)現(xiàn)步驟

    spring boot利用docker構(gòu)建gradle項(xiàng)目的實(shí)現(xiàn)步驟

    這篇文章主要給大家介紹了關(guān)于spring boot利用docker構(gòu)建gradle項(xiàng)目的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • Springboot處理CORS跨域請(qǐng)求的三種方法

    Springboot處理CORS跨域請(qǐng)求的三種方法

    這篇文章主要介紹了Springboot處理CORS跨域請(qǐng)求的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • java socket接收保證能讀完數(shù)據(jù)的實(shí)例

    java socket接收保證能讀完數(shù)據(jù)的實(shí)例

    這篇文章主要介紹了java socket接收保證能讀完數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java中Steam流的用法詳解

    Java中Steam流的用法詳解

    Stream是Java?8?API添加的一個(gè)新的抽象,稱為流Stream,本文主要介紹了Java中Steam流的用法詳解,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-04-04
  • Java StringBuilder類相關(guān)知識(shí)總結(jié)

    Java StringBuilder類相關(guān)知識(shí)總結(jié)

    這篇文章主要介紹了Java StringBuilder類相關(guān)知識(shí)總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java中的HashMap集合深度解析

    Java中的HashMap集合深度解析

    這篇文章主要介紹了Java中的HashMap集合深度解析, HashMap可以說(shuō)是Java中最常用的集合類框架之一,是Java語(yǔ)言中非常典型的數(shù)據(jù)結(jié)構(gòu),我們總會(huì)在不經(jīng)意間用到它,很大程度上方便了我們?nèi)粘i_(kāi)發(fā),需要的朋友可以參考下
    2023-09-09
  • Java字符串常量池和intern方法解析

    Java字符串常量池和intern方法解析

    本文主要介紹了Java字符串常量池和intern方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評(píng)論

长岛县| 夹江县| 积石山| 前郭尔| 留坝县| 堆龙德庆县| 宁津县| 石嘴山市| 兰西县| 莱阳市| 南澳县| 陇川县| 莎车县| 彰武县| 辽宁省| 隆尧县| 红河县| 鹤山市| 扎赉特旗| 武安市| 益阳市| 治县。| 光泽县| 贵阳市| 磐安县| 府谷县| 武城县| 阿图什市| 伽师县| 嘉荫县| 汝城县| 同德县| 乌拉特中旗| 思茅市| 宣城市| 福海县| 三明市| 清镇市| 和硕县| 河曲县| 鱼台县|