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

Spring為什么要用三級緩存解決循環(huán)依賴呢

 更新時間:2025年01月07日 10:24:44   作者:一個儒雅隨和的男子  
本文主要介紹了Spring如何使用三級緩存解決循環(huán)依賴問題,本文為了方便說明,先設置兩個業(yè)務層對象,命名為AService和BService,結合示例給大家介紹的非常詳細,感興趣的朋友一起看看吧

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

本文為了方便說明,先設置兩個業(yè)務層對象,命名為AService和BService。其中Spring是如何把一個Bean對象創(chuàng)建出來的,其生命周期如下:

構造方法–> 不同對象 --> 注入依賴 -->初始化前 --> 初始化后–>放入單例池Map(一級緩存)—>Bean對象

Map的數據結構為,key表示單例的名稱,而value是一個對象。其中單例池就是所謂的一級緩存。

循環(huán)依賴,如AService中依賴了一個BService,BService也依賴了AService,AService和BService相互依賴。這里換出現一個問題,但是Spring使用三級緩存給解決了。
首先我們要看的是為什么出現循環(huán)?
首先在AService中引入了@Componet注解,那AService的生命周期會交給Spring管理。AService生命周期如下,本文把該例子定義為示例1。

AService生命周期
1.實例化 --->AService的普通對象
2.填充BService(添加了AutoWired)-->從單例池中獲取BService(此時單例池中可能還沒存放BService的Bean)-->創(chuàng)建BService
  當單例池中可能還沒存放BService的Bean時,觸發(fā)創(chuàng)建BService生命周期,步驟和AService一致。如下所示:
  2.1.實例化--->BService的普通對象
  2.2.填充AService(添加了AutoWired)-->單例池(此時AAService也在創(chuàng)建中,還沒放入單例池,如果創(chuàng)建的話,就會出現循環(huán)依賴)
  2.3.填充其他屬性
  2.4.其他步驟(包括AOP)
  2.5.加入到單例池中
3.填充其他屬性
4.其他步驟(包括AOP)
5.加入到單例池中

簡單解決示例1中的問題

主要是定義個Map存放第一步生成的普通對象。Map的名稱暫且為boziMap<beanName,普通對象>,示例2如下所示:

AService生命周期
1.實例化 --->AService的普通對象---->存入boziMap<beanName,AService的普通對象>
2.填充BService(添加了AutoWired)-->從單例池中獲取BService(此時單例池中可能還沒存放BService的Bean)-->創(chuàng)建BService
  當單例池中可能還沒存放BService的Bean時,觸發(fā)創(chuàng)建BService生命周期,步驟和AService一致。如下所示:
  2.1.實例化--->BService的普通對象
  2.2.填充AService(添加了AutoWired)-->單例池(此時AAService也在創(chuàng)建中,還沒放入單例池,如果創(chuàng)建的話,就會出現循環(huán)依賴)--->boziMap中取AService對象。
  2.3.填充其他屬性
  2.4.其他步驟(包括AOP)
  2.5.加入到單例池中
3.填充其他屬性
4.其他步驟(包括AOP)--> AService代理對象(AServiceProxy)
5.加入到單例池中

其中AService對象的代理對象和AService的代理對象如下所示:

示例2中通過一個boziMap打破了循環(huán)創(chuàng)建bean對象,而產生的循環(huán)依賴。而在AOP過程中,步驟2.2.填充AService時,應該是把4.其他步驟,AService代理對象賦值給步驟2.2.填充AService的普通對象。所以要對示例2進行優(yōu)化,把AOP放到第二步,先判斷是否出現循環(huán)依賴,在進行AOP,再把AService的代理對象放入biziMap中。得到示例3:

AService生命周期
0.creatingSet[AService]表示正在創(chuàng)建中的Bean。
1.實例化 --->AService的普通對象
2.填充BService(添加了AutoWired)-->從單例池中獲取BService
	(此時單例池中可能還沒存放BService的Bean)-->創(chuàng)建BService
  當單例池中可能還沒存放BService的Bean時,觸發(fā)創(chuàng)建BService生命周期,步驟和AService一致。如下所示:
  2.1.實例化--->BService的普通對象
  2.2.填充aService(添加了AutoWired)-->單例池-->creatingSet中是否存在AService-->AOP-->AService的代理對象-->最后賦值給BService中的屬性aService
  2.3.填充其他屬性
  2.4.其他步驟
  2.5.加入到單例池中
3.填充其他屬性
4.其他步驟(包括AOP)--> AService代理對象(AServiceProxy)
5.加入到單例池中

此時加大難度,多加一個CService,C中依賴的A,而A中也依賴了C,根據示例3,會得到如下步驟。把本例子定義為示例4,該例子中,填充bService和cService會反復創(chuàng)建代理對象。

AService生命周期
0.creatingSet[AService]表示正在創(chuàng)建中的Bean。
1.實例化 --->AService的普通對象
2.填充BService,CService(添加了AutoWired)-->從單例池中獲取BService
	(此時單例池中可能還沒存放BService的Bean)-->創(chuàng)建BService
  當單例池中可能還沒存放BService的Bean時,觸發(fā)創(chuàng)建BService生命周期,步驟和AService一致。如下所示:
  2.1.實例化--->BService的普通對象
  2.2.填充aService(添加了AutoWired)-->單例池-->creatingSet中是否存在AService-->AOP-->AService的代理對象-->最后賦值給BService中的屬性aService
  2.3.填充其他屬性
  2.4.其他步驟
  2.5.加入到單例池中
  填充CService,CService的生命周期
  2.1.實例化-->BService的普通對象
  2.2.填充aService(添加了AutoWired)-->creatingSet中是否存在AService-->AOP-->AService的代理對象-->最后賦值給CService中的屬性aService
  2.3.填充其他屬性
  2.4.其他步驟
  2.5.加入到單例池中
3.填充其他屬性
4.其他步驟(包括AOP)--> AService代理對象(AServiceProxy)
5.加入到單例池中

為了解決這個問題,使用二級緩存存放A的代理對象。

AService生命周期
0.creatingSet[AService]表示正在創(chuàng)建中的Bean。
1.實例化 --->AService的普通對象
2.填充BService,CService(添加了AutoWired)-->從單例池中獲取BService
	(此時單例池中可能還沒存放BService的Bean)-->創(chuàng)建BService
  當單例池中可能還沒存放BService的Bean時,觸發(fā)創(chuàng)建BService生命周期,步驟和AService一致。如下所示:
  2.1.實例化--->BService的普通對象
  2.2.填充aService(添加了AutoWired)-->單例池-->creatingSet中是否存在AService-->循環(huán)依賴
  --->earlySingletonObjects是否存在aService的代理對象,存在返回bean即可
  -->AOP-->AService的代理對象-->存入二級緩存,earlySingletonObjects<beanName,AService的代理對象>-->最后賦值給BService中的屬性aService
  2.3.填充其他屬性
  2.4.其他步驟
  2.5.加入到單例池中
  填充CService,CService的生命周期
  2.1.實例化-->BService的普通對象
  2.2.填充aService(添加了AutoWired)-->單例池-->creatingSet中是否存在AService-->earlySingletonObjects
  2.3.填充其他屬性
  2.4.其他步驟
  2.5.加入到單例池中
3.填充其他屬性
4.其他步驟(包括AOP)--> AService代理對象(AServiceProxy)
5.加入到單例池中

三級緩存

三級緩存為了打破循環(huán),在第一步驟中生成的不同對象,用三級緩存保存起來。三級緩存在Spring‘源碼中可singletonFactories,是一個Map,其中它的value存的是一個lambda表達式,其中的邏輯是,判斷是否需要AOP,需要則返回一個代理對象,反之則返回Service的普通對象。’

小結

一級緩存的作用就是保存經過完整生命周期的Bean對象。
二級緩存,早期由于出現循環(huán)依賴,保存那些還沒完整走完bean生命周期的bean對象,是為了給其他Bean填充屬性時使用的代理對象賦值。
三級緩存,在出現循環(huán)依賴時,如果二級緩存中沒有存有對應的bean對象,需要通過三級緩存去判斷,是否需要AOP,是則需要返回代理對象,否則需要返回普通對象。三級返回的的結果最終還是存在二級緩存中。Spring的核心源碼實現如下所示。

到此這篇關于Spring為什么要用三級緩存解決循環(huán)依賴的文章就介紹到這了,更多相關Spring三級緩存解決循環(huán)依賴內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Boot 集成 RocketMQ 全流程指南(從依賴引入到消息收發(fā))

    Spring Boot 集成 RocketMQ 全流程指南(從依賴引入到消息收發(fā)

    本文將通過 手動連接 和 配置連接 兩種方式,詳細講解如何在 Spring Boot 中集成 RocketMQ,實現消息的同步與異步發(fā)送,并提供完整示例代碼,感興趣的朋友一起看看吧
    2025-04-04
  • JAVA一個快速排序實現代碼

    JAVA一個快速排序實現代碼

    排序有哪幾種方法?請列舉。并用JAVA實現一個快速排序.,需要的朋友可以參考下
    2017-02-02
  • Java中的switch新特性與使用詳解

    Java中的switch新特性與使用詳解

    這篇文章主要介紹了Java中的switch新特性與使用詳解,Switch語句可以實現根據某一變量選則執(zhí)行代碼塊,當然直接使用If語句也可以做到,但是有時候使用Switch語句往往更加簡潔優(yōu)美,需要的朋友可以參考下
    2023-11-11
  • Spring注入Bean的一些方式總結

    Spring注入Bean的一些方式總結

    這篇文章主要給大家總結介紹了關于Spring注入Bean的一些方式,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • Spring深入分析講解BeanUtils的實現

    Spring深入分析講解BeanUtils的實現

    java知識體系統(tǒng)有很多數據實體,比較常用的DTO、BO、DO、VO等,其他類似POJO概念太老了現在基本廢棄掉了,本篇幅直接忽略,對于這幾種數據實體各自代表的含義和應用場景先做一下簡單描述和分析
    2022-06-06
  • MybatisPlus 插入或更新數據時自動填充更新數據解決方案

    MybatisPlus 插入或更新數據時自動填充更新數據解決方案

    本文主要介紹了MybatisPlus 插入或更新數據時自動填充更新數據解決方案,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Spring+MyBatis實現數據讀寫分離的實例代碼

    Spring+MyBatis實現數據讀寫分離的實例代碼

    本篇文章主要介紹了Spring+MyBatis實現數據讀寫分離的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 詳解jdbc實現對CLOB和BLOB數據類型的操作

    詳解jdbc實現對CLOB和BLOB數據類型的操作

    這篇文章主要介紹了詳解jdbc實現對CLOB和BLOB數據類型的操作的相關資料,這里實現寫入操作與讀寫操作,需要的朋友可以參考下
    2017-08-08
  • java中File類應用遍歷文件夾下所有文件

    java中File類應用遍歷文件夾下所有文件

    這篇文章主要為大家詳細介紹了java中File類應用遍歷文件夾下所有文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java實現用位運算維護狀態(tài)碼

    Java實現用位運算維護狀態(tài)碼

    位運算是一種非常高效的運算方式,在算法考察中比較常見,那么業(yè)務代碼中我們如何使用位運算呢,感興趣的小伙伴快跟隨小編一起學習一下吧
    2024-03-03

最新評論