Spring中的循環依賴的解決辦法

Spring中的循環依賴的解決辦法

文章目錄

  • Spring中的循環依賴的解決辦法
    • 情形一:使用構造注入方式注入依賴
    • 情形二:使用Setter方式進行依賴注入
    • 情形三:使用延遲加載進行依賴注入
    • 情形四:使用第三方庫進行依賴注入

先說明:推薦使用構造注入依賴的方式來解決循環依賴。還有不要把實例化與初始化搞混了,注意這兩個的時機。

Spring中循環依賴的解決方案主要有以下幾種:

情形一:使用構造注入方式注入依賴

  • 構造注入

構造注入不會循環依賴的原因在于,Spring在創建bean實例時,會立即解析依賴關系,并將依賴對象注入到bean實例中。例如,以下代碼中,A類和B類之間存在循環依賴:

public class A {private B b;//步驟1.創建A的實例,未初始化 //步驟3獲取到B的實例并對A進行初始化public A(B b) {this.b = b;}
}public class B {private A a;//步驟2創建B的實例未初始化 //步驟4獲取到A的實例并對B進行初始化public B(A a) {this.a = a;}
}

構造注入的時候創建B的實例也需要先創建A的實例。但是,Spring在創建bean實例時,會使用一種特殊的機制來解決循環依賴的問題。

Spring在創建bean實例時,會使用循環依賴解析器(Circular Dependency Resolver)來解決循環依賴的問題。循環依賴解析器會按照一定的順序來創建bean實例。對于構造注入,循環依賴解析器會按照如下順序來創建bean實例:

1. 創建A的實例,但是A的實例還沒有初始化。
2. 創建B的實例,但是B的實例還沒有初始化。
3. 初始化A的實例,此時A的實例可以訪問到B的實例。
4. 初始化B的實例,此時B的實例可以訪問到A的實例。

流程大概是這樣,就不會出現循環依賴的問題了。

情形二:使用Setter方式進行依賴注入

  • setter注入

相比之下,setter方法注入是在bean實例創建完成后再解析依賴關系,并將依賴對象注入到bean實例中。例如,以下代碼中,A類和B類之間也存在循環依賴:

Java

public class A {private B b;//步驟1.他是先創建A的實例再創建B的實例(在調用A的Set方法之前肯定是已經有了A的實例) //步驟3.將B實例注入到A就會報錯,因為A實例已經存在了public void setB(B b) {this.b = b;}
}public class B {private A a;//步驟2.在創建B的實例的時候A的實例已經存在了,可以直接獲取到B的實例public void setA(A a) {this.a = a;}
}

當Spring創建A類的實例時,A類的實例已經創建完成了。但是,B類的實例還沒有創建。Spring會在調用setB方法時,解析依賴關系,并將B類的實例注入到A類中。但是,由于A類的實例已經創建完成了,所以Spring無法創建B類的實例。這樣,就出現了循環依賴的問題。

大概過程如下:

1. 創建A的實例
2. 將B注入到A中
3. 創建B的實例

因此,如果要避免循環依賴,建議使用構造注入。

情形三:使用延遲加載進行依賴注入

  • 延遲加載

延遲加載是指在bean實例真正需要使用依賴對象時才進行依賴注入。延遲加載可以避免循環依賴的問題,但可能會導致性能下降。

示例

Java

@Lazy
public class A {private B b;public A() {}public B getB() {if (b == null) {b = new B();}return b;}
}public class B {private A a;public B() {}public A getA() {if (a == null) {a = new A();}return a;}
}

上述代碼中,A類和B類之間存在循環依賴。如果使用延遲加載,Spring會在A類或B類真正需要使用依賴對象時才進行依賴注入。這樣就不會出現循環依賴的問題

情形四:使用第三方庫進行依賴注入

  • 使用第三方庫

Spring Boot提供了@AutowiredAnnotationBeanPostProcessor類,可以用于解決循環依賴的問題。該類會在bean實例創建完成后再解析依賴關系,并將依賴對象注入到bean實例中。

示例

Java

@AutowiredAnnotationBeanPostProcessor
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean.getClass().getName().equals("com.example.A")) {A a = (A) bean;a.setB(new B());}return bean;}
}

上述代碼中,A類和B類之間存在循環依賴。如果使用@AutowiredAnnotationBeanPostProcessor類,Spring會在A類或B類真正需要使用依賴對象時再進行依賴注入。這樣就不會出現循環依賴的問題。

上面就是對循環依賴的解決方式分析,推薦使用構造方式注入。

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

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

相關文章

windows上安裝DBeaver

訪問 DBeaver 的官方網站(https://dbeaver.io/)。 在主頁上找到并點擊 "Download" 或 "Get DBeaver Now"(獲取 DBeaver)按鈕。 您將看到不同的下載選項,選擇適用于 Windows 的安裝程序。通常為 …

重磅!2023年兩院院士增選名單公布

中國科學院 關于公布2023年中國科學院院士增選當選院士名單的公告 根據《中國科學院院士章程》《中國科學院院士增選工作實施辦法(試行)》等規定,2023年中國科學院選舉產生了59名中國科學院院士。 現予公布。 中國科學院 2023年11月22日…

設計模式——結構型模式

結構型模式描述如何將類或對象按某種布局組成更大的結構。它分為類結構型模式和對象結構型模式,前者采用繼承機制來組織接口和類,后者釆用組合或聚合來組合對象。 由于組合關系或聚合關系比繼承關系耦合度低,滿足“合成復用原則”,所以對象結構型模式比類結構型模式具有更…

機器學習算法(1)——簡單線性回歸

一、說明 在在這篇文章中,我們將學習我們的第一個機器學習算法,稱為簡單線性回歸。這是一個重要的算法,因為當您可能正在學習第一個神經網絡(稱為人工神經網絡)時,在此算法中學習的技術也適用于深度學習。我…

畢業設計ASP.NET 1400動漫公司網站【程序源碼+文檔+調試運行】

摘要 本系統將實現一個動漫公司網站,包括前臺用戶模塊和后臺管理員模塊。前臺用戶模塊主要包括最新動漫、注冊登錄、公司簡介、公司新聞、動漫中心、聯系我們和會員中心等功能。后臺管理員模塊包括用戶管理、公司簡介管理、公司新聞管理、動漫類別管理、動漫管理、…

加工車間污水處理設備有哪些

在加工車間中,污水處理設備是至關重要的一部分。它們的功能是將污水進行處理,確保其達到符合環保標準的水質要求。以下是一些常見的加工車間污水處理設備: 1.初級沉淀池:初級沉淀池是最基本的污水處理設備之一。它通過重力作用將…

阿里云服務器ECS產品知識及購買和使用常見問題及答案匯總

本文總結了阿里云用戶在購買和使用阿里云服務器中的一些常見的問題,包括什么是云服務器ECS,特性與優勢,應用場景,基本概念,使用限制等眾多問題,讓您全方位了解阿里云服務器,并根據自己的需求選擇…

Qt pro常用宏

RC_ICONS IStudio.icoCONFIG no_debug_release # 不會生成debug 和 release 文件目錄 DESTDIR $$PWD/../bin # 指定編譯最終文件的生成路徑 OBJECTS_DIR $$PWD/temp/obj # obj中間文件存放路徑 MOC_DIR $$PWD/temp/moc # moc中間文件…

百戰python01-初識python_turtle繪圖

文章目錄 簡介練習1.簡易的進度條學習使用turtle在屏幕上繪制圖形注:需要對python有基本了解,可查看本作者python基礎專欄,有任何問題歡迎私信或評論(本專欄每章內容都將不定期進行內容擴充與更新) 簡介 python簡介及方向+pycharm安裝使用請轉 練習 注:嘗試練習。了解…

Windows系統中curl和wget命令下載說明

前言 當需要在命令行中發送 HTTP 請求時,常用的工具有 curl 和 wget。它們可以幫助你下載文件,發送 POST 或 GET 請求,以及檢查網頁內容等。 curl: curl 是一個功能強大的命令行工具,支持多種協議(例如 HTTP、HTTPS、…

常見樹種(貴州省):010任豆、漆樹、椿樹、伯樂樹、欒樹、楸樹、橡膠樹、鹽膚木、吳茱萸、黃柏

摘要:本專欄樹種介紹圖片來源于PPBC中國植物圖像庫(下附網址),本文整理僅做交流學習使用,同時便于查找,如有侵權請聯系刪除。 圖片網址:PPBC中國植物圖像庫——最大的植物分類圖片庫 一、任豆 …

趨勢解讀:TikTok獨創的社交語言是如何演變的

在數字時代的浪潮中,社交媒體平臺成為人們傳遞信息、表達創意和建立社交聯系的重要場所。而在這眾多社交平臺中,TikTok以其獨特的社交語言和創新的內容形式,迅速吸引了全球數以億計的用戶。本文將深入探討TikTok的社交語言是如何獨創并演變的…

中年人怎么發展?持續發展?

現在ai這么火,就像當年的xxx,如果沒有抓住,會xxx嗎? 為了ai,多學學python也是也是好的啊。 在學習之余,還是想做做自媒體的。不求馬上賺到錢。我的想法是,現在每天下班回家都是刷刷抖音&#…

win10戴爾電腦安裝操作系統遇到的問題MBR分區表只能安裝GPT磁盤

首先按F2啟動boot管理界面 調整啟動盤的啟動順序,這里啟動U盤為第一順序。 第一步 選擇安裝程序的磁盤 第二步 轉換磁盤為GPT磁盤 一般出現 磁盤0和1,說明存在兩個盤 ,這里兩個盤不是說的是C盤和D盤的問題,而是在物理上實際存在…

easyExcel實現分批導入,動態表頭分批導出,以及導出表格樣式設置

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency> 一&#xff0c;分批導入 1.首先配置表格頭映射類 Getter Setter EqualsAndHashCode public class …

YOLOV5標注訓練自己的數據全流程教程

概述 yolo在目標檢測領域是非常有代表性的模型&#xff0c;它速度快識別效果也很精準&#xff0c;是實時檢測模型中應用最廣泛的。yolo的原理和代碼是很容易獲得的&#xff0c;且有各式各樣的教程&#xff0c;但是模型怎么使用的教程相對比較少。本文講解如何使用yolov5模型訓…

Linux運行jmeter報錯java.sql.SQLException:Cannot create PoolableConnectionFactory

在性能測試過程中遇見1個問題&#xff0c;終于解決了&#xff0c;具體問題如下。 問題 在windows電腦寫jmeter腳本連接數據庫連接成功 然后把該腳本放到Linux服務器上面&#xff0c;并把jmeter mysql驅動放到服務器上面&#xff0c;修改jmeter的mysql驅動路徑信息 注意&…

第十三章 : Spring Boot 日志記錄脫敏

第十三章 : Spring Boot 日志記錄脫敏 前言 本章重點:介紹secure-ext-spring-boot-starter 如何引入以及敏感數據脫敏,打印日志過程中自動脫敏,且支持手機號、郵箱、身份證號、住址、中文名、座機號、銀行卡、自定義等多種類型的脫敏。 基于Spring boot 2.3.2.RELEASE 背景…

【快速解決】實驗一:模擬實現進程的創建《操作系統上機》實驗報告

目錄 實驗要求 正文開始 ?編輯 難點講解 結語 實驗要求 實驗一&#xff1a;進程的創建 一、實驗項目類型&#xff1a;設計型 二、實驗目的和要求 加深對進程概念的理解&#xff0c;熟悉PCB的組織&#xff0c;深入了解創建進程的一般過程&#xff0c;掌握用隊列組織進程的…

數據庫系統之常用數據庫你用過幾個?

MySQL 開發廠商&#xff1a;AB公司——>Sun公司——>甲骨文公司 最新版本&#xff1a;5.7.43、8.0.34 發行方式: 社區版&#xff08;MySQL Community Server&#xff09; 免費&#xff0c;MySQL不提供任何技術支持 商業版&#xff08;MySQL Enterprise Edition&#xff0…