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

Java Spring循環(huán)依賴原理與bean的生命周期圖文案例詳解

 更新時間:2021年09月02日 08:36:37   作者:liangsheng_g  
這篇文章主要介紹了Spring循環(huán)依賴原理與bean的生命周期圖文案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

前言

Spring是如何處理循環(huán)依賴的,又是怎么做到,互相注入對方的proxy bean而不是raw bean的?現(xiàn)在就分析一下

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

Spring中放入兩個Service,分別是C1和C2,然后C1和C2又互為對方的成員變量。這種情況C1和C2就可以說是相互循環(huán)依賴了

二、源碼圖解

1. bean的主要生命周期圖解

在這里插入圖片描述

上圖是一個沒有循壞依賴的bean的主要生命周期節(jié)點,下圖的循壞依賴可以結(jié)合該圖解一起看

2.循環(huán)依賴圖解

在這里插入圖片描述

可以看到里面有一個很重要的邏輯:

當一個bean經(jīng)過所有的步驟之后,會去三個緩存里的二級緩存根據(jù)beanName獲取對象。

  1. 如果拿不到,就直接使用initializeBean方法之后生成的bean,然后放入到spring容器中
  2. 如果拿得到,就要對比執(zhí)行initializeBean前后的bean,如果bean相同,就用二級緩存里的對象作為bean放入到spring容器中,否則就報錯
  3. 所以spring3個緩存中,二級緩存存在的意義就是判斷該bean是否被循環(huán)依賴過,只有被循環(huán)依賴了,注入到其他bean的屬性里了,才會放入到二級緩存。
  4. 然后最后的判斷,判斷initializeBean方法執(zhí)行前后對象是否一致,其實就是為了判斷被循環(huán)依賴的bean在注入到其他bean和自己走完bean生命周期的是不是同一個object,如果不是同一個object,那就有問題,要報錯。

在這里插入圖片描述

可以看到此處第二個參數(shù)allEarlyReference,這個參數(shù)就是用來區(qū)分從3個緩存里取bean的時候是否需要到3級緩存里取對象,此處為false,所以截止到2級為止。

3. 循環(huán)依賴處理完成之后

在這里插入圖片描述

直接從Spring容器里拿的是c1 proxy或者c2 proxy,但是其實在屬性注入的時候,都是調(diào)用的raw對象的set方法,也就是proxy的target調(diào)用的set方法。

總結(jié)

循環(huán)依賴其實耐下功夫讀源碼,也沒有那么難。下次分享為什么循環(huán)依賴的其中一個類添加@Async有可能會導致注入失敗而拋異常

到此這篇關(guān)于Spring循環(huán)依賴原理與bean的生命周期圖文案例詳解的文章就介紹到這了,更多相關(guān)Spring循環(huán)依賴原理與bean的生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java通過URLClassLoader類加載器加載外部jar代碼示例

    java通過URLClassLoader類加載器加載外部jar代碼示例

    ClassLoader翻譯過來就是類加載器,普通的java開發(fā)者其實用到的不多,但對于某些框架開發(fā)者來說卻非常常見,下面這篇文章主要給大家介紹了關(guān)于java通過URLClassLoader類加載器加載外部jar的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • java并發(fā)編程專題(十一)----(JUC原子類)數(shù)組類型詳解

    java并發(fā)編程專題(十一)----(JUC原子類)數(shù)組類型詳解

    這篇文章主要介紹了JAVA JUC原子類 數(shù)組類型詳解的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • java ThreadPoolExecutor線程池拒絕策略避坑

    java ThreadPoolExecutor線程池拒絕策略避坑

    這篇文章主要為大家介紹了java ThreadPoolExecutor拒絕策略避坑踩坑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • SpringBoot基于Disruptor實現(xiàn)高效的消息隊列?

    SpringBoot基于Disruptor實現(xiàn)高效的消息隊列?

    Disruptor是一個開源的Java框架,它被設(shè)計用于在生產(chǎn)者-消費者問題上獲得盡量高的吞吐量和盡量低的延遲,本文主要介紹了SpringBoot基于Disruptor實現(xiàn)高效的消息隊列?,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • ElasticSearch合理分配索引分片原理

    ElasticSearch合理分配索引分片原理

    這篇文章主要介紹了ElasticSearch合理分配索引分片原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java實現(xiàn)給微信群中定時推送消息

    Java實現(xiàn)給微信群中定時推送消息

    這篇文章主要為大家詳細介紹了Java如何實現(xiàn)給微信群中定時推送消息的功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以了解一下
    2022-12-12
  • Spring?boot?整合?Redisson實現(xiàn)分布式鎖并驗證功能

    Spring?boot?整合?Redisson實現(xiàn)分布式鎖并驗證功能

    這篇文章主要介紹了Spring?boot?整合?Redisson實現(xiàn)分布式鎖并驗證,redisson是官方推薦的分布式鎖實現(xiàn)方案,采用redis自身的原子命令和lua腳本來實現(xiàn),需要的朋友可以參考下
    2022-05-05
  • Java集合Iterator迭代的實現(xiàn)方法

    Java集合Iterator迭代的實現(xiàn)方法

    這篇文章主要介紹了Java集合Iterator迭代接口的實現(xiàn)方法,非常不錯,具有參考借鑒家,對Java 結(jié)合iterator知識感興趣的朋友一起看看吧
    2016-08-08
  • 新建Maven工程出現(xiàn)Process?Terminated的問題解決

    新建Maven工程出現(xiàn)Process?Terminated的問題解決

    當Maven出現(xiàn)"Process terminated"錯誤時,這通常是由于配置文件或路徑錯誤導致的,本文主要介紹了新建Maven工程出現(xiàn)Process?Terminated的問題解決,感興趣的可以了解一下
    2024-04-04
  • Mybatis中Collection集合標簽的使用詳解

    Mybatis中Collection集合標簽的使用詳解

    這篇文章主要介紹了Mybatis中Collection集合標簽的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06

最新評論

乌什县| 邯郸县| 太原市| 宝应县| 华容县| 辽中县| 花莲市| 东乡族自治县| 子洲县| 贞丰县| 桐柏县| 平山县| 新邵县| 阳高县| 如东县| 太湖县| 临湘市| 贵州省| 当雄县| 西乌珠穆沁旗| 镇原县| 疏附县| 墨竹工卡县| 东海县| 安吉县| 尚义县| 长兴县| 邢台市| 平乐县| 古田县| 观塘区| 定西市| 九江市| 太白县| 四川省| 太仓市| 石阡县| 长宁区| 丰台区| 壤塘县| 新绛县|