欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

假設(shè)有兩個 Bean AB

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

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

二、三級緩存機制

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

一級緩存singletonObjects

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

二級緩存earlySingletonObjects

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

三級緩存singletonFactories

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

三、為什么需要三級緩存?兩級不行嗎?

假如只使用一級緩存和二級緩存:

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

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

總結(jié)

三級緩存機制的關(guān)鍵點在于:

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

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

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

相關(guān)文章

  • 淺談springmvc的DispatcherServlet分析

    淺談springmvc的DispatcherServlet分析

    本篇文章主要介紹了淺談springmvc的DispatcherServlet分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 詳解在spring boot中配置多個DispatcherServlet

    詳解在spring boot中配置多個DispatcherServlet

    本篇文章主要介紹了詳解在spring boot中配置多個DispatcherServlet,具有一定的參考價值,有興趣的可以了解一下。
    2017-03-03
  • IntelliJ IDEA全局內(nèi)容搜索和替換教程圖解

    IntelliJ IDEA全局內(nèi)容搜索和替換教程圖解

    很多朋友在做項目時,會在整個項目里活指定文件夾下進行全局搜索和替換,下面小編給大家?guī)砹薎ntelliJ IDEA全局內(nèi)容搜索和替換教程圖解,需要的朋友參考下吧
    2018-04-04
  • java8 stream 由一個list轉(zhuǎn)化成另一個list案例

    java8 stream 由一個list轉(zhuǎn)化成另一個list案例

    這篇文章主要介紹了java8 stream 由一個list轉(zhuǎn)化成另一個list案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java 如何實現(xiàn)多語言配置i18n

    java 如何實現(xiàn)多語言配置i18n

    這篇文章主要介紹了java 如何實現(xiàn)多語言配置i18n的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 基于jvm java內(nèi)存區(qū)域的介紹

    基于jvm java內(nèi)存區(qū)域的介紹

    下面小編就為大家?guī)硪黄趈vm java內(nèi)存區(qū)域的介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 基于Spring實現(xiàn)自定義錯誤信息返回詳解

    基于Spring實現(xiàn)自定義錯誤信息返回詳解

    這篇文章主要為大家詳細介紹了如何基于Spring實現(xiàn)自定義錯誤信息返回效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • java實現(xiàn)自定義時鐘并實現(xiàn)走時功能

    java實現(xiàn)自定義時鐘并實現(xiàn)走時功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)自定義時鐘并實現(xiàn)走時功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java超詳細講解類變量和類方法

    Java超詳細講解類變量和類方法

    這篇文章主要介紹了JAVA類變量及類方法代碼實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-05-05
  • SpringBoot實現(xiàn)elasticsearch索引操作的代碼示例

    SpringBoot實現(xiàn)elasticsearch索引操作的代碼示例

    這篇文章主要給大家介紹了SpringBoot如何實現(xiàn)elasticsearch 索引操作,文中有詳細的代碼示例,感興趣的同學(xué)可以參考閱讀下
    2023-07-07

最新評論