如何解決SpringBoot2.6及之后版本取消了循環(huán)依賴的支持問題
1、問題
循環(huán)依賴指的是兩個或者多個bean之間相互依賴,形成一個閉環(huán)。直接表現(xiàn)為兩個service層互相調用對方。
此時會遇到以下問題:
2、報錯
當啟動項目時,可能出現(xiàn)程序不能啟動的情況,查看調試日志,會提示:
The dependencies of some of the beans in the application context form a cycle...
如下圖所示:

根據上述代碼片段,應用程序存在以下循環(huán)依賴:
1. adminBorrowInfoController 依賴 borrowInfoServiceImpl
2. borrowInfoServiceImpl 依賴 lendServiceImpl
3. lendServiceImpl 依賴 lendItemServiceImpl
4. lendItemServiceImpl 又反過來依賴 lendServiceImpl
這樣就形成了一個循環(huán)依賴的場景。
原因是SpringBoot 從 2.6.0 開始默認不允許出現(xiàn) Bean 循環(huán)引用。而且這個是在Bean 定義上也就是類上就不允許出現(xiàn)循環(huán)引用。
3、解決方案
第1種、在全局配置文件設置允許循環(huán)引用存在
升級到Spring Boot 2.7及以上版本,可以通過spring.main.allow-circular-references=true配置屬性明確開啟循環(huán)依賴支持。
但我用的2.6.11也可以哦,2.6以上的可以試試。
spring:
main:
allow-circular-references:true第2種、在SpringApplicationBuilder 添加設置允許循環(huán)引用
使用SpringApplicationBuilder來啟動Spring Boot應用,并通過allowCircularReferences(true)方法開啟了循環(huán)依賴支持。
public static void main(String[] args) {
new SpringApplicationBuilder(DemoApplication.class).allowCircularReferences(true).run(args);
}第N種、還有很多種供大家了解使用
1. 構造器注入
- 在類中定義構造器,添加需要依賴的類作為參數
- 使用@Autowired注解構造器
- Spring會先實例化依賴類,然后通過構造器注入
2. @Lazy
- 在導致循環(huán)依賴的Bean上添加@Lazy注解
- Spring會延遲初始化這些Bean,先完成非Lazy的Bean初始化
- 然后再通過setter注入完成Lazy Bean的初始化
3. ObjectFactory
- 定義ObjectFactory屬性,類型為對應類的ObjectFactory
- Spring會代理注入ObjectFactory,獲取對象時才初始化目標Bean
4. 服務定位器
- 定義一個統(tǒng)一的服務定位器類
- Bean直接從定位器獲取依賴對象,而不是注入依賴
5. 合并類
- 將互相依賴的類合并為一個類,避免相互依賴
6. 事件回調
- 使用事件或者回調方式實現(xiàn)解耦
- 一個類通過事件通知另一個類執(zhí)行操作,而不是直接調用
7. 接口編程
- 類依賴接口,不依賴具體實現(xiàn)
- 具體實現(xiàn)通過setter注入接口
以上是一些主要的具體實現(xiàn)步驟,可以根據實際情況選擇適合的方案。
總體上,出現(xiàn)循環(huán)依賴通常意味著系統(tǒng)設計需要優(yōu)化和解耦,需要重新梳理服務的職責和依賴關系,減少不必要的互相依賴,以提高內聚性和可維護性。
這些僅為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot+log4j2.xml使用application.yml屬性值問題
這篇文章主要介紹了SpringBoot+log4j2.xml使用application.yml屬性值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Java 調用Restful API接口的幾種方式(HTTPS)
這篇文章主要介紹了Java 調用Restful API接口的幾種方式(HTTPS),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
FileUtils擴展readURLtoString讀取url內容
這篇文章主要介紹了FileUtils擴展readURLtoString使用其支持讀取URL內容為String,支持帶POST傳大量參數,大家參考使用吧2014-01-01
IntelliJ IDEA優(yōu)化配置的實現(xiàn)
這篇文章主要介紹了IntelliJ IDEA優(yōu)化配置的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07

