spring循環依賴解決

問題描述

spring循環依賴是對于ioc容器。類A、B、C,類A依賴了B,類A依賴了C,類B依賴了A,類C依賴了A。假如現在類A需要放到ioc,屬性賦值的時候會去找B這個bean,但是B不存在,于是去創建B這個bean,但是實例化beanB之后再屬性賦值的時候需要注入A這個bean。這樣就造成了循環。

解決辦法

spring通過三級緩存解決循環依賴問題,首次注入beanA的時候會在類A實例化之后,spring會創建一個ObjectFactory用來后續獲取beanA的早期引用,并將這個ObjectFactory放到三級緩存中。接著注入beanB,初始化類B之后屬性賦值,需要注入beanA,這是spring會去三級緩存中獲取A的ObjectFactory調用getObject()獲取A的早期引用,如果A需要被代理(如@Transactional),會在此時去創建A的代理對象,放到二級緩存中,然后刪除三級緩存的A的工廠對象。此時returnA這時循環有了出口,就解決了循環依賴。

補充

時序圖

  • 實例化->new A(這里把創建A的ObjectFactory放到三級緩存)
  • 屬性賦值(循環依賴的時候這里去創建AOP代理)
  • 初始化(正常這里創建aop代理)

三級緩存是為了支持aop代理的按需創建。二級緩存的話就是直接把早期對象放到二級緩存,實例化A之后馬上把他放到二級緩存。如果直接把早期對象放到二級緩存,(實例化之后)就無法靈活決定是否創建代理(因為AOP代理是在postProcessAfterInitialization(上圖初始化中)中創建的)。可能導致重復創建代理或代理失效。
而如果是三級緩存的話

spring創建一個bean的階段

1.實例化(instantiation)      ->new A()
2.屬性注入(Populate Properties->setB(),setC()
3.初始化(Initialization->調用init-method,BeanPostProcessorpostProcessBeforeInitialization//是BeanPostProcessor的方法初始化方法(@PostConstruct,init-method)postProcessAfterInitialization ->AOP代理就在這里創建!//是BeanPostProcessor的方法
4.放入一級緩存(singletonObject)

Spring 提供了 InstantiationAwareBeanPostProcessor.getEarlyBeanReference() 方法,允許 AOP 模塊在早期引用階段就決定是否創建代理。這個方法會在 ObjectFactory.getObject() 被調用時觸發,是提前創建代理的關鍵入口

代碼細節

三級緩存:singletonFactories如下

Map<String, ObjectFactory<?>> singletonFactories

其中鍵是類名首字母小寫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92055.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92055.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92055.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最新安卓原生對接蘋果cms App后端+app(最新優化版)

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 一定要按照教程教的來搭建&#xff01; App演示圖片 二、效果展示 1.部分代碼 代碼如下&#xff08;示例&#xff09;&#xff1a; public static function apkinfo(){return self::…

嵌入式硬件中運放的基本控制原理

上次課的最后是給大家總結一些基礎電子知識的,我們接著往下講。我們知道了運放的虛短虛斷的概念理論上來說 可以進行計算了是吧。 這個圖實際上是一個正輸入信號的同相放大電路,我們看下如何計算,第一先看虛斷。運放的輸入腳內部對地是阻抗十分大是吧,那么這個正輸入腳上的…

聚集索引與非聚集索引的區別

聚集索引&#xff08;Clustered Index&#xff09;和非聚集索引&#xff08;Non-Clustered Index&#xff09;是索引設計的核心概念&#xff0c;二者的本質區別體現在 與數據物理存儲的關聯方式 上&#xff0c;這種區別直接決定了它們的性能特性和適用場景。我們平時說的 聚簇索…

《零基礎入門AI:傳統機器學習進階(從擬合概念到K-Means算法)》

一、欠擬合與過擬合欠擬合(Underfitting) 欠擬合是指模型在訓練數據上表現不佳&#xff0c;同時在新的未見過的數據上也表現不佳。這通常發生在模型過于簡單&#xff0c;無法捕捉數據中的復雜模式時。欠擬合模型的表現特征如下&#xff1a; 訓練誤差較高。測試誤差同樣較高。模…

Datawhale AI夏令營 第三期 task2 稍微改進

在打造基于大語言模型&#xff08;LLM&#xff09;文檔檢索的問答系統中&#xff0c;財經研報類文檔是最具挑戰的場景之一。它包含圖文混排、精細定位需求&#xff08;頁碼、文件名&#xff09;、問題措辭高度多樣化等一系列復雜性。 下面的內容是大模型輔助整理的&#xff1a;…

LeetCood算法題~水果成籃

水果成籃 你正在探訪一家農場&#xff0c;農場從左到右種植了一排果樹。這些樹用一個整數數組 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵樹上的水果 種類 。你想要盡可能多地收集水果。然而&#xff0c;農場的主人設定了一些嚴格的規矩&#xff0c;你必須按照要求采摘水…

【Lua】題目小練8

-- 題目 1&#xff1a;定義一個類 Person-- 屬性&#xff1a;name、age&#xff0c;其中 age 默認是 0&#xff0c;不能小于 0。-- 方法&#xff1a;introduce()&#xff0c;輸出 "My name is <name>, I am <age> years old."-- 要求使用封裝思想&#x…

SAP PP CK466

原因 作業價格沒有維護 解決方案 KP26

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘keras’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘keras’問題 摘要 在使用 PyCharm 進行深度學習項目開發時&#xff0c;常常需要通過 pip install keras 來安裝 Keras 庫。但有時即便命令執行成功&#xff0c…

人工智能領域、圖歐科技、IMYAI智能助手2024年全年歷史更新大事件匯總

2024年 2024年12月29日 【通知】 1、主站導出文檔功能優化升級&#xff0c;新增支持了純文本WORD導出功能&#xff0c;支持使用WPS軟件打開 注&#xff1a;原來的富文本WORD不支持使用WPS打開&#xff0c;只支持系統自帶的WORD軟件打開&#xff0c;比如Microsoft Office Word 2…

UWB實操:使用UCI CMD測距;UCI CMD是一串數字,創建測距session,配置測距session,開始測距session。

使用UCI CMD測距; UCI CMD是一串數字,創建測距session,配置測距session,開始測距session。根據 FiRa_UCI_Technical_Specification,我們可以分析并組織測距cmd 例如: Fira2.0 1v1 發起 DSTWR 創建測距session:210000052222222200 配置測距session: 2103001F222…

從AUTOSAR角度理解CAN以及CANFD

一、AUTOSAR對CAN和CAN FD的基礎定位 CAN&#xff1a;基于傳統CAN 2.0B協議&#xff0c;是AUTOSAR早期版本&#xff08;如4.0.3及之前&#xff09;的核心車載通信協議&#xff0c;支持最大8字節 payload&#xff0c;仲裁段波特率通常≤1Mbps&#xff0c;適用于低帶寬、高實時性…

第27章:服務部署與容器化

1. 課程引言 在前面的章節中&#xff0c;我們已經完成了電商項目核心服務的開發。然而&#xff0c;開發完成只是項目生命周期的一部分&#xff0c;如何將這些服務高效、可靠地部署到生產環境&#xff0c;是決定項目成敗的關鍵一步。本章將聚焦于服務的部署&#xff0c;重點介紹…

力扣148:排序鏈表

力扣148:排序鏈表題目思路代碼題目 給你鏈表的頭結點 head &#xff0c;請將其按 升序 排列并返回 排序后的鏈表 。 思路 當我們第一眼看見這道題時心中其實是有思路的&#xff0c;我們不想這是個鏈表就當它是一個整型數組。那么自然而然就會想到各種各樣的排序方法&#xf…

基于k8s環境下的pulsar常用命令(下)

#作者&#xff1a;Unstopabler 文章目錄permissionSchemapermission pulsar的權限控制是在namespace級別的 kubectl exec pulsar-toolset-0 -n pulsar – bin/pulsar-admin namespaces grant-permission mytenant/mynamespace –actions produce,consume –role admin10 注…

2.4 組件通信

Props 和 Events&#xff08;父子組件通信&#xff09;Props&#xff1a;父組件向子組件傳遞數據使用 props。子組件通過聲明 props 來接收來自父組件的數據。<!-- 父組件 --> <template><ChildComponent :message"parentMessage" /> </templat…

PCL學習之路-基礎知識-(一)

文章目錄1.西門子S7系列PLC類型劃分(1).大型PLC&#xff1a;S7-400(2).中型PLC&#xff1a;S7-300(3).小型PLC&#xff1a;S7-200系列2.西門子S7外形結構(1).總覽&#xff1a;PLC的“器官”分工邏輯3.輸出電路(1).小型繼電器輸出形式(2).大功率晶體管/場效應管輸出形式(3).雙向…

leetcode654:最大二叉樹(遞歸與單調棧雙解法)

文章目錄一、 題目描述二、 核心思路&#xff1a;分而治之與遞歸構造三、代碼實現與深度解析四、 關鍵點與復雜度分析五、拓展解法單調棧解法兩種解法對比LeetCode 654. 最大二叉樹&#xff0c;【難度&#xff1a;中等&#xff1b;通過率&#xff1a;82.6%】&#xff0c;這道題…

Python 循環語法詳解

在編程中&#xff0c;循環是一種非常常見的控制結構。很多時候&#xff0c;我們需要重復做一些事情&#xff0c;比如遍歷列表、處理數據、嘗試直到成功等。這時候&#xff0c;就離不開循環了。Python 提供了兩種主要的循環結構&#xff1a;for 循環 和 while 循環。本篇文章會從…

一個小巧神奇的 USB數據線檢測儀

一個小巧的數據線檢測儀&#xff0c;檢測各種USB數據線是否損壞、通斷&#xff0c;TYPE_C、MICRO_B、蘋果線、燒錄線、網線都可檢測。嵌入式開發者的稱手工具。 這個是我個人制作的&#xff0c;SMT和連接器比較貴&#xff0c;特別是24PIN的C口連接器&#xff0c;我掛在黃色小魚…