Spring 無法解決循環依賴的 5 種場景

一、構造器注入引發的循環依賴

1. 問題復現

@Component
public class ServiceA {private final ServiceB serviceB;@Autowiredpublic ServiceA(ServiceB serviceB) { // 構造器注入this.serviceB = serviceB;}
}@Component
public class ServiceB {private final ServiceA serviceA;@Autowiredpublic ServiceB(ServiceA serviceA) { // 構造器注入this.serviceA = serviceA;}
}

?報錯信息:Requested bean is currently in creation: Is there an unresolvable circular reference?

2. 原理分析

  • 三級緩存失效:構造器注入要求在實例化階段完成依賴注入,而此時 Bean 尚未放入三級緩存。

  • 生命周期沖突

3. 解決方案

  • 方案 1:將其中一個 Bean 改為 Setter / 字段注入
  • 方案 2:使用 `@Lazy` 延遲加載
    @Autowiredpublic ServiceA(@Lazy ServiceB serviceB) { this.serviceB = serviceB;}

二、原型(Prototype)作用域的循環依賴

1. 問題復現

@Scope("prototype")
@Component
public class PrototypeA {@Autowired private PrototypeB b;
}@Scope("prototype")
@Component
public class PrototypeB {@Autowired private PrototypeA a;
}

2. 原理分析

  • 緩存機制不生效:原型 Bean 不會存入三級緩存,每次請求都創建新實例。

  • Spring 官方限制:明確說明不處理原型 Bean 的循環依賴。

3. 解決方案

  • 重構設計:避免原型 Bean 之間的循環依賴

  • 改用單例:評估是否真的需要原型作用域

三、@Async 注解導致的代理沖突

1. 問題復現

@Service
public class AsyncServiceA {@Autowired private AsyncServiceB serviceB;@Asyncpublic void asyncMethod() { /* ... */ }
}@Service
public class AsyncServiceB {@Autowired private AsyncServiceA serviceA;
}

2. 原理分析

  • 代理時序問題@Async?通過后置處理器生成代理,可能破壞三級緩存機制。

  • 典型錯誤棧

    BeanCreationException: Error creating bean with name 'asyncServiceA': 
    Bean with name 'asyncServiceA' has been injected into other beans [...] in their raw version as part of a circular reference.

3. 解決方案

  • 方案 1:對異步方法所在類使用接口代理
    @Async
    public interface AsyncService {void asyncMethod();
    }@Service
    public class AsyncServiceImpl implements AsyncService { /* ... */ }
  • 方案 2:在注入點添加?@Lazy
    @Autowired @Lazy private AsyncServiceA serviceA;

四、Configuration 類之間的循環依賴

1. 問題復現

@Configuration
public class ConfigA {@Autowired private ConfigB configB;
}@Configuration
public class ConfigB {@Autowired private ConfigA configA;
}

2. 原理分析

  • 配置類加載順序:配置類需要優先初始化,無法通過常規循環依賴解決。

  • Spring 限制@Configuration?類被視為特殊 Bean,其代理機制與普通 Bean 不同。

3. 解決方案

  • 重構配置類:合并相關配置

  • 使用?@DependsOn:明確指定加載順序

    @Configuration
    @DependsOn("configB")
    public class ConfigA { /* ... */ }

五、自定義 BeanPostProcessor 引發的沖突

1. 問題復現

@Component
public class CustomProcessor implements BeanPostProcessor {@Autowired private ServiceX x; // 依賴其他Bean
}

2. 原理分析

  • 處理器加載時序BeanPostProcessor?需要優先初始化,此時普通 Bean 尚未創建。

  • Spring 啟動流程

?3. 解決方案

  • 避免在 BeanPostProcessor 中注入其他 Bean

  • 使用延遲注入

    private ObjectProvider<ServiceX> xProvider;public Object postProcessBeforeInitialization(Object bean, String beanName) {ServiceX x = xProvider.getIfAvailable();// ...}

六、終極解決方案工具箱?

問題類型應急方案根治方案
構造器循環依賴@Lazy?注解改為 Setter 注入
原型Bean循環依賴重構作用域引入中間類抽象依賴
AOP代理沖突接口代理模式調整切面作用順序
配置類循環依賴@DependsOn?指定順序合并配置類
BeanPostProcessor依賴ObjectProvider?延遲獲取分離處理器與業務邏輯

結語:跳出循環依賴的思維陷阱

Spring 的循環依賴處理機制體現了框架設計的高度智慧,但作為開發者,最優雅的解決方案往往不是技術手段,而是架構設計。通過以下原則可從根本上避免循環依賴:

  1. 單一職責原則:拆分臃腫的 Bean

  2. 依賴倒置原則:面向接口編程

  3. 層次化設計:Controller -> Service -> Repository 的嚴格分層

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

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

相關文章

Core Vision Kit(基礎視覺服務)

文章目錄 一、Core Vision Kit簡介場景介紹約束與限制二、通用文字識別三、人臉檢測一、Core Vision Kit簡介 Core Vision Kit(基礎視覺服務)是機器視覺相關的基礎能力,例如通用文字識別(即OCR,Optical Character Recognition,也稱為光學字符識別)、人臉檢測、人臉比對…

第TR3周:Pytorch復現Transformer

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 Transformer通過自注意力機制&#xff0c;改變了序列建模的方式&#xff0c;成為AI領域的基礎架構 編碼器&#xff1a;理解輸入&#xff0c;提取上下文特征…

FreeRTOS 任務間通信機制:隊列、信號量、事件標志組詳解與實驗

1. FreeRTOS 消息隊列 1.1 簡介 ? 隊列是 任務間通信的主要形式&#xff0c;可用于在任務之間以及中斷與任務之間傳遞消息。隊列在 FreeRTOS 中具有以下關鍵特點&#xff1a; 隊列默認采用 先進先出 FIFO 方式&#xff0c;也可以使用 xQueueSendToFront()實現 LIFO。FreeRT…

【虛擬化】Docker Desktop 架構簡介

在閱讀前您需要了解 docker 架構&#xff1a;Docker architecture WSL 技術&#xff1a;什么是 WSL 2 1.Hyper-V backend 我們知道&#xff0c;Docker Desktop 最開始的架構的后端是采用的 Hyper-V。 Docker daemon (dockerd) 運行在一個 Linux distro (LinuxKit build) 中&…

Unity光照之Halo組件

簡介 Halo 組件 是一種用于在游戲中創建光暈效果的工具&#xff0c;主要用于模擬光源周圍的發光區域&#xff08;如太陽、燈泡等&#xff09;或物體表面的光線反射擴散效果。 核心功能 1.光暈生成 Halo 組件會在光源或物體的周圍生成一個圓形光暈&#xff0c;模擬光線在空氣…

Flink深入淺出之01:應用場景、基本架構、部署模式

Flink 1?? 一 、知識要點 &#x1f4d6; 1. Flink簡介 Apache Flink — Stateful Computations over Data StreamsApache Flink 是一個分布式大數據處理引擎&#xff0c;可對有界數據流和無界數據流進行有狀態的計算。Flink 能在所有常見集群環境中運行&#xff0c;并能以…

2025年【高壓電工】報名考試及高壓電工考試總結

隨著電力行業的快速發展&#xff0c;高壓電工成為確保電力系統安全穩定運行的重要一環。為了提高高壓電工的專業技能和安全意識&#xff0c;“安全生產模擬考試一點通”平臺特別整理了2025年高壓電工報名考試的相關信息及考試總結&#xff0c;并提供了一套完整的題庫&#xff0…

網絡HTTP

HTTP Network Request Library A Retrofit-based HTTP network request encapsulation library that provides simple and easy-to-use API interfaces with complete network request functionality. 基于Retrofit的HTTP網絡請求封裝庫&#xff0c;提供簡單易用的API接口和完…

os-copilot安裝和使用體驗測評

簡介&#xff1a; OS Copilot是阿里云基于大模型構建的Linux系統智能助手&#xff0c;支持自然語言問答、命令執行和系統運維調優。本文介紹其產品優勢、功能及使用方法&#xff0c;并分享個人開發者在云服務器資源管理中的實際應用體驗。通過-t/-f/管道功能&#xff0c;OS Cop…

Python Flask框架學習匯編

1、入門級&#xff1a; 《Python Flask Web 框架入門》 這篇博文條理清晰&#xff0c;由簡入繁&#xff0c;案例豐富&#xff0c;分十五節詳細講解了Flask框架&#xff0c;強烈推薦&#xff01; 《python的簡單web框架flask【附例子】》 講解的特別清楚&#xff0c;每一步都…

【HarmonyOS Next之旅】DevEco Studio使用指南(一)

目錄 1 -> 工具簡介 1.1 -> 概述 1.2 -> HarmonyOS應用/服務開發流程 1.2.1 -> 開發準備 1.2.2 -> 開發應用/服務 1.2.3 -> 運行、調試和測試應用/服務 1.2.4 -> 發布應用/服務 2 -> 工程介紹 2.1 -> APP包結構 2.2 -> 切換工程視圖 …

Manus開源平替-開源通用智能體

原文鏈接:https://i68.ltd/notes/posts/250306-opensource-agi-agent/ OWL-比Manus還強的全能開源Agent OWL: Optimized Workforce Learning for General Multi-Agent Assistance in Real-World Task Automation&#xff0c;現實世界中執行自動化任務的通用多代理輔助優化學習…

【3.2-3.8學習周報】

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 摘要Abstract一、方法介紹1.任務適應性持續預訓練&#xff08;TACP&#xff09;2.領域自適應連續預訓練&#xff08;DACP&#xff09;3.ETS-DACP和ETA-DACP 二、實驗…

【Linux】用戶和組

思考 使用useradd在Linux下面創建一個用戶&#xff0c;默認情況下&#xff0c;會自動創建一個同名組&#xff0c;并且加入其中&#xff0c;那么是先創建用戶呢&#xff1f;還是先創建組呢&#xff1f; 很簡單&#xff0c;我們實踐一下不就知道了&#xff0c;如下所示&#xff…

新編大學應用英語綜合教程2 U校園全套參考答案

全套答案獲取&#xff1a; 鏈接&#xff1a;https://pan.quark.cn/s/389618f53143

SAP 顧問的五年職業規劃

SAP 顧問的職業發展受到技術進步、企業需求變化和全球經濟環境的影響&#xff0c;因此制定長遠規劃充滿挑戰。面對 SAP 產品路線圖的不確定性&#xff0c;如向 S/4HANA 和 Business Technology Platform (BTP) 的轉變&#xff0c;顧問必須具備靈活性&#xff0c;以保持競爭力和…

圖像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image

圖像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image 文章目錄 圖像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image主要創新點模型架構圖生成器生成器源碼 判別器判別器源碼 損失函數需要源碼講解的私信我 S…

Networking Based ISAC Hardware Testbed and Performance Evaluation

文章目錄 Applications and Challenges of Networked SensingCooperation Mechanism in Networked SensingChallenges and Key Enabling Technologies 5G NR Frame Structure Based ISAC ApproachSignals Available for Radio SensingMulti-Dimensiona Resource Optimization S…

2025年主流原型工具測評:墨刀、Axure、Figma、Sketch

2025年主流原型工具測評&#xff1a;墨刀、Axure、Figma、Sketch 要說2025年國內產品經理使用的主流原型設計工具&#xff0c;當然是墨刀、Axure、Figma和Sketch了&#xff0c;但是很多剛入行的產品經理不了解自己適合哪些工具&#xff0c;本文將從核心優勢、局限短板、協作能…

我代表中國受邀在亞馬遜云科技全球云計算大會re:Invent中技術演講

大家好我是小李哥&#xff0c;本名叫李少奕&#xff0c;目前在一家金融行業公司擔任首席云計算工程師。去年5月很榮幸在全球千萬名開發者中被選為了全球亞馬遜云科技認證技術專家&#xff08;AWS Hero&#xff09;&#xff0c;是近10年來大陸地區僅有的第9名大陸專家。同時作為…