国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java中的循環(huán)依賴以及解決方案

這篇具有很好參考價值的文章主要介紹了java中的循環(huán)依賴以及解決方案。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

java中的循環(huán)依賴以及解決方案

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

我們創(chuàng)建了兩個類,一個類A,一個類B(當然循環(huán)依賴不一定只是兩個類,可能是多個以及以上的類),在A里面引入了B,在B里面引入了A,這時候就構(gòu)成了一個循環(huán)問題,看似無止境,無盡頭
java中的循環(huán)依賴以及解決方案
他們之間的關(guān)系如下
java中的循環(huán)依賴以及解決方案

spring循環(huán)依賴解決方案

這些類在我們spring框架啟動的時候,會進行有序的掃描并實例化
拿A舉例:
1.實例化A
2.將a對象放入到指定的三級緩存對象
3.setName…當?shù)匠蓡T變量b的時候,發(fā)現(xiàn)B上面有@Atowired注解,就會觸發(fā)B的實例化過程

  • 實例化B
  • 將b對象放入到指定的三級緩存對象
  • setName…當?shù)匠蓡T變量a的時候,就會去spring的三級緩存里面直接去拿
  • B的實例化完成

4.拿到b的實例化對象

注意:構(gòu)造器注入構(gòu)成的循環(huán)依賴是無法解決的!只能拋出BeanCurrentlyInCreationException異常表示循環(huán)依賴,構(gòu)造函數(shù)之間發(fā)生循環(huán)依賴(A的構(gòu)造方法中依賴B,B的構(gòu)造方法中依賴A),程序會在運行時一直循環(huán)調(diào)用最終導致內(nèi)存溢出。
錯誤原因:
根本原因是 Spring 解決循環(huán)依賴依靠的是 Bean 的 中間態(tài) 這個概念,而中間態(tài)指的是 已經(jīng)實例化,但未初始化的狀態(tài)。而構(gòu)造器負責的是實例化,故無法解決構(gòu)造器循環(huán)依賴。

spring的三級緩存

在Spring框架中,有一個名為"三級緩存"(Three-level Cache)的概念,用于管理Bean的創(chuàng)建和解決循環(huán)依賴的問題。

三級緩存是指在Spring容器實例化Bean的過程中,使用了三個緩存來管理Bean的創(chuàng)建和依賴關(guān)系。具體來說,這三個緩存分別是singletonObjects、earlySingletonObjects和singletonFactories。

singletonObjects:這是一級緩存,用于保存已經(jīng)完全初始化的單例Bean的實例。當Bean創(chuàng)建完成后,它將被放入此緩存中,并且可以通過Bean名稱進行訪問。

earlySingletonObjects:這是二級緩存,用于保存已經(jīng)實例化但尚未完全初始化的單例Bean的實例。當Spring框架檢測到循環(huán)依賴時,會首先將已實例化但未初始化的Bean放入該緩存中,以便后續(xù)的依賴注入。一旦所有的依賴都已注入完成,Bean將從此緩存中移除,并放入一級緩存中。

singletonFactories:這是三級緩存,用于保存Bean的工廠類實例。當Spring框架檢測到循環(huán)依賴時,會先創(chuàng)建一個Bean的工廠類實例并放入該緩存中。這樣,當另一個Bean需要引用該Bean時,可以通過工廠類來獲取實例,并在后續(xù)的實例化過程中完成循環(huán)依賴。

通過使用這三個級別的緩存,Spring框架可以在解決循環(huán)依賴問題時進行適當?shù)奶幚恚_保Bean的實例化和依賴注入的順序正確。同時,三級緩存也有助于提高性能,避免重復創(chuàng)建Bean實例。但需要注意的是,三級緩存是Spring框架內(nèi)部使用的機制,對開發(fā)者來說通常是透明的,不需要直接操作或干預。

在Java中,使用三級緩存是解決循環(huán)依賴問題的一種方案,通常被稱為"提前暴露引用(Early Reference)"方案。

循環(huán)依賴是指兩個或多個Bean之間相互依賴的情況,在實例化過程中可能會造成死鎖或無法正確注入依賴的問題。為了解決這個問題,Spring框架引入了三級緩存機制,并且使用"提前暴露引用"的方式來處理循環(huán)依賴。

"提前暴露引用"方案的基本思想是,在實例化Bean的過程中,先創(chuàng)建一個早期的、未完全初始化的Bean實例,并將其放入二級緩存中。然后,在完成當前Bean的依賴注入之后,再從二級緩存中取出該早期實例并進行初始化。這樣,可以通過提前暴露引用的方式解決循環(huán)依賴的問題。

在三級緩存中的三個級別,二級緩存即為保存早期實例的緩存,通過它來實現(xiàn)"提前暴露引用"的方案。當依賴注入完成后,早期實例會轉(zhuǎn)移到一級緩存中,而三級緩存中的工廠類實例則會被移除。

需要注意的是,三級緩存和"提前暴露引用"方案都是Spring框架內(nèi)部實現(xiàn)的,對于開發(fā)者來說通常是透明的。開發(fā)者只需按照正常的依賴關(guān)系進行編碼,Spring框架會根據(jù)三級緩存機制來解決循環(huán)依賴問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-445941.html

到了這里,關(guān)于java中的循環(huán)依賴以及解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Redis中的緩存穿透、雪崩、擊穿的原因以及解決方案

    Redis中的緩存穿透、雪崩、擊穿的原因以及解決方案

    是指用戶查詢數(shù)據(jù),在數(shù)據(jù)庫沒有,自然在緩存中也不會有。這樣就導致用戶查詢的時候,在緩存中找不到,每次都要去數(shù)據(jù)庫再查詢一遍,然后返回空(相當于進行了兩次無用的查詢)。這樣請求就繞過緩存直接查數(shù)據(jù)庫,這也是經(jīng)常提的緩存命中率問題。 我們可以簡單的

    2024年02月12日
    瀏覽(21)
  • Java 常見緩存詳解以及解決方案

    Java 常見緩存詳解以及解決方案

    首先我們準備一個接口 兩個實現(xiàn)的方法, 當我們調(diào)用這個queryAll()方法時我們需要調(diào)用selectAll()方法來查詢數(shù)據(jù) ?調(diào)用此接口實現(xiàn)效果 ?這個時候我們就可以發(fā)現(xiàn)了問題,我們調(diào)用方法之后對數(shù)據(jù)庫查詢了兩次,但是只有一次請求這樣進行了多次查詢,造成了資源的浪費

    2024年01月25日
    瀏覽(21)
  • Java中的死鎖及其解決方案

    Java中的死鎖及其解決方案

    在Java中,鎖是很常見的一個工具,常見的用法就是在高并發(fā)場景下保證線程安全,但是使用不當也會造成死鎖,給我們帶來一些不必要的麻煩,本文分析死鎖及其產(chǎn)生原因,并作出相應的解決方案。 死鎖產(chǎn)生的四個必要條件 1)互斥條件:進程對所分配到的資源進行排他性控

    2024年02月07日
    瀏覽(21)
  • spring 的循環(huán)依賴以及spring為什么要用三級緩存解決循環(huán)依賴

    spring 的循環(huán)依賴以及spring為什么要用三級緩存解決循環(huán)依賴

    ??????? bean的生命周期 ??????? 這里簡單過一下 class -無參構(gòu)造 -普通對象 -依賴注入(對加了autowire等的屬性賦值) -初始化前-初始化 -初始化后(aop) -放入單例池的map(一級緩存) -bean對象 這里提一點單例bean單例bean 其實就是用mapbeanName,Bean對象創(chuàng)建的,多例bean就不

    2024年02月15日
    瀏覽(24)
  • sql中的時間范圍查詢【三種方式】以及Mapper.xml中遇到大于號小于號問題解決方案

    mapper注意事項 字符 轉(zhuǎn)義字符 描述 gt; 大于 = gt;= 大于等于 lt; 小于 = lt;= 小于等于 \\\" quot; 雙引號 ’ apos; 單引號 amp; and 遇到問題: 從數(shù)據(jù)庫獲取時間傳到前端進行展示的時候,我們有時候可能無法得到一個滿意的時間格式的時間日期,在數(shù)據(jù)庫中顯示的是正確的時間格式,獲

    2024年02月10日
    瀏覽(22)
  • Java中的單點登錄原理與實現(xiàn)方案探究:深入了解安全與便捷的用戶認證解決方案

    Java中的單點登錄原理與實現(xiàn)方案探究:深入了解安全與便捷的用戶認證解決方案

    目錄 1、什么是單點登錄 2、單點登錄的優(yōu)勢和應用場景 3、單點登錄的原理和實現(xiàn)方式 3.1 傳統(tǒng)的Cookie和Session實現(xiàn)方式 3.2 基于Token的實現(xiàn)方式 3.3 基于OAuth2的實現(xiàn)方式 4、單點登錄的技術(shù)要點和關(guān)鍵問題 4.1 安全性考慮 4.2 用戶體驗優(yōu)化 4.3 高可用性設計 5、Java中的單點登錄實

    2024年01月23日
    瀏覽(18)
  • POM依賴報錯解決方案匯總

    POM依賴報錯解決方案匯總

    POM依賴報錯解決方案匯總 狀況 1 創(chuàng)建完一個maven項目,在pom文件在引入依賴,等下方自動導入加載完畢,去查看IDEA工具的Maven Projects工具選項中Dependencies 依然后依賴紅色報錯 2 在pom文件中,引用依賴后,該依賴的版本號處直接出現(xiàn)紅色 3 IDEA工具的Maven Projects工具選項中Dependencies下的

    2024年02月08日
    瀏覽(24)
  • IDEA中maven無法下載依賴解決方案

    IDEA中maven無法下載依賴解決方案

    如果你嘗試了很多網(wǎng)上的辦法 仍然沒有解決 那么很有可能和我一樣碰到**了,解決辦法千奇百怪, 解決之前(山丹丹的那個紅艷艷)都沒我屏幕紅,本人試了一下幾種 1、檢查maven配置 settings.xml(應該都沒問題),重建新的倉庫(個人不建議這種操作,太麻煩所以我也沒試)

    2024年01月20日
    瀏覽(26)
  • Spring中的循環(huán)依賴是什么?如何解決它?

    循環(huán)依賴是指兩個或多個Bean之間相互依賴,導致它們無法被正確地初始化。在Spring中,當兩個或多個Bean之間存在循環(huán)依賴時,Spring容器無法決定哪個Bean應該先初始化,因此會拋出BeanCurrentlyInCreationException異常,從而導致應用程序啟動失敗。 ??為了解決循環(huán)依賴問題,Spr

    2023年04月16日
    瀏覽(51)
  • JS for循環(huán)異步解決方案

    JavaScript中的for循環(huán)是一種同步操作,它將阻塞代碼的執(zhí)行,直到循環(huán)完成。但是,在處理異步操作時,使用同步for循環(huán)會導致問題。 為了解決這個問題,可以使用以下兩種異步解決方案: 遞歸是一種有效的解決方案,它可以確保異步操作按照預期執(zhí)行。以下是使用遞歸實現(xiàn)

    2024年02月13日
    瀏覽(40)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包