nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException(Spring循環依賴問題)

1:問題

最近啟動項目時候,遇到如下報錯

nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'stockReceiptManager': Bean with name 'stockReceiptManager' has been injected

the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.

?

2:分析原因

后來在網上找了半天說是依賴循環,檢查了一下代碼,確實存在循環依賴的現象

spring默認是支持循環依賴,allowCircularRefrence默認為true。也可以手動設置applicationContext.setAllowCircularReferences(false); 產生這個問題原因:in its raw version as part of a circular reference, but has eventually been wrapped.應該是項目中對某個類的方法開啟異步@Async導致

?

3:解釋循環依賴

首先說一下什么是依賴循環,比如:我現在有一個ServiceA需要調用ServiceB的方法,那么ServiceA就依賴于ServiceB,那在ServiceB中再調用ServiceA的方法,就形成了循環依賴。Spring在初始化bean的時候就不知道先初始化哪個bean就會報錯。

由于類A通過構造注入需要類B的實例,而類B通過構造注入需要類B的實例,二者之間相互注入,導致循環引用拋出異常,這是一個典型的先有雞還是先有蛋的故事。所以在使用spring配置類的循環依賴的關系時,應當盡量避免使用構造注入,而是使用setter注入。

public class ClassA {@AutowiredClassB classB;
}public class ClassB {@AutowiredClassA classA ;
} 

?

那如何解決循環依賴,當然最好的方法是重構你的代碼,進行解耦,但是重構不是一時的事情,那就使用下面的方法:

方法一:

<bean id="ServiceDependent1" class="org.xyz.ServiceDependent1" lazy-init="true"><constructor-arg ref="Service"/>
</bean><bean id="ServiceDependent2" class="org.xyz.ServiceDependent2" lazy-init="true"><constructor-arg ref="Service"/>
</bean>

?

方法二:

在你的配置文件中,在互相依賴的兩個bean的任意一個加上lazy-init屬性。

在你注入bean時,在互相依賴的兩個bean上加上@Lazy注解也可以。

以上兩種方法都能延遲互相依賴的其中一個bean的加載,從而解決循環依賴的問題。

    @Autowired@Lazyprivate ClassA classA;@Autowired@Lazyprivate ClassB classB;

?

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

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

相關文章

linux分區設置大小,Linux調整磁盤分區大小

Resize the disk (Linux調整磁盤分區大小)Resize the partition. Run parted: $ partedShow the partition list: (parted) printThere should be two partitions; 1 should be a boot partition, about 64MB; the second should be the main partition, about 3.6GSome Disk C…

電腦技巧:盤點常用的Win組合快捷鍵

今天給大家繼續分享電腦使用技巧&#xff0c;給大家介紹一下有哪些常用Win組合快捷鍵&#xff0c;希望可以對大家的日常辦公提高幫助&#xff01; 1、WinE&#xff1a;打開我的電腦 超級實用的一個組合鍵&#xff0c;不論你當前在操作什么&#xff0c;只要按下這個組合鍵&#…

簡單正則替換

var reganew RegExp(" ","g"); //創建正則RegExp對象 ntrstrntrstr.replace(rega,""); var regbnew RegExp(" ","g"); //創建正則RegExp對象 ntrstrntrstr.replace(regb,""); var regcnew Reg…

電腦技巧:電腦安裝操作系統、重裝系統常見的問題解決方法

目錄 1、提示權限不足 2、添加PE開機引導菜單失敗 3、磁盤格式錯誤 4、除系統盤外&#xff0c;未找到任何其他非系統磁盤分區 5、計算機意外地重新啟動或遇到錯誤 6、windows無法完成安裝 7、U盤安裝系統時出現如下圖錯誤 8、下載速度慢、卡住 重裝系統現在也不是什么難事&…

linux開發板上程序如何調試,linux開發板調試典型方法

tftpdsudo apt-get install tftpd openbsd-inetd將/etc/inetd.conf中的最后一個路徑設置成你希望讓客戶端存取文件的目錄例如下面的“/tftpboot”(記得開放該目錄的讀寫權限)&#xff1a;“tftp dgram udp wait nobody /usr/sbin/t…

電腦技巧:Win10電腦卡頓解決小技巧,非常實用

目錄 1、及時關閉不常用的后臺進程 2、建議打開GPU硬件加速功能 3、及時更新升級硬件驅動 4、適當降低Windows動畫特效 5、開啟Windows自帶的游戲模式 電腦用的時間越久就會越卡頓了&#xff0c;今天小編給大家分享五個小技巧&#xff0c;來解決電腦卡頓的問題&#xff0c;有需…

線程其實就是一個個指令組成的,當這個線程內的指令全部執行完了,那么這個線程也就執行結束了

線程其實就是一個個指令組成的&#xff0c;當這個線程內的指令全部執行完了&#xff0c;那么這個線程也就執行結束了

page,client,offset區別

offset:相對于當前“盒子”的距離 &#xff0c;與滾動條無關 client:相對于可視區域的距離&#xff0c;與滾動條無關 page:相對于整個頁面的距離&#xff0c;與滾動條有關 示例代碼&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 …

linux netbeans 中文亂碼,淺談Linux Netbeans字體反鋸齒處理

用的Linux發行版是Ubuntu8.04&#xff0c;如果使用源里面的JDK一切都很簡單(現在源里的版本是1.6u6)&#xff0c;JDK6開始支持反鋸齒。裝完Netbeans你就會驚喜的發現&#xff0c;仿原生GUI的界面(GTK&#xff0b;)上的文字是反鋸齒的&#xff0c;但是編輯器里面的文字是鋸齒的&…

Win10軟件:推薦兩款Windows操作系統下的遠程軟件,值得收藏!

遠程控制軟件是程序員日常必備的工具&#xff0c;現場市面上有微軟自帶的遠程連接工具、向日葵、teamviewer等遠程控制軟件。他們都有一個共同的缺點&#xff0c;無法針對遠程連接設置分組、別名。大多數情況下&#xff0c;我們可能需要連接十幾個甚至幾十個Windows遠程服務器。…

開發機多用戶 xdebug 遠程調試 PhpStorm

在公司都用的遠程開發機開發&#xff0c;每次有錯誤調試就得dd(xxx)然后保存真是&#xff0c;讓我在本地開發用慣xdebug的情何以堪&#xff0c;所以有了下文。 1.安裝配置xdebug 直接使用pecl安裝即可# pecl install xdebug 然后寫xdebug配置&#xff0c;下面是我的設置(具體擴…

linux查看 idt日志,實現RCP的日志管理

做插件開發的都知道當應用跑不起來了就去看看workspace里的.log文件&#xff0c;錯誤信息很詳細,那樣解決問題就方便多了&#xff0c;這個功能很好&#xff0c;所以學習了下&#xff0c;和大家分享下&#xff0c;實現的原理也就一行代碼Java代碼 Platform.getLog(Platform.getB…

電腦技巧:電腦內存不足解決小技巧

熟悉電腦硬件的朋友們都知道&#xff0c;內存相對于電腦來說是一個相當重要的部件&#xff0c;內存屬于CPU的“工作室”&#xff0c;因為電腦所有運行的程序都是在內存中運行&#xff0c;它決定了多少、多大的程序能即時運行&#xff0c;如若執行的應用程序過大或者過多就會導致…

前端:分享一些實用的JS代碼片段

今天給大家分享一些實用的JS代碼片段&#xff0c;有需要的朋友歡迎收藏&#xff01;1、獲取瀏覽器的版本function getBrowser() {var UserAgent navigator.userAgent.toLowerCase();var browserInfo {};var browserArray {IE: window.ActiveXObject || "ActiveXObject&…

20145206 《信息安全系統設計基礎》第十二周學習總結

20145206 《信息安全系統設計基礎》第十二周學習總結 本周學習目標 1、第九周代碼檢查 2、第十周代碼檢查 3、第十一周代碼檢查 博客鏈接 20145206 《信息安全系統設計基礎》第九周學習總結20145206 《信息安全系統設計基礎》第十周學習總結20145206 《信息安全系統設計基礎》第…

linux數據同步技術比較,linux下實現web數據同步的四種方式(性能比較)教程.docx

linux下實現web數據同步的四種方式(性能比較)教程實現web數據同步的四種方式1、nfs實現web數據共享2、rsync inotify實現web數據同步3、rsyncsersync更快更節約資源實現web數據同步4、unisoninotify實現web數據雙向同步一、nfs實現web數據共享?nfs能實現數據同步是通過NAS(網絡…

lambda創建線程

Testpublic void add() {//方式一Thread thread1 new Thread("ttt") {Overridepublic void run() {System.out.println("1");}};thread1.start();//方式二Runnable runnable new Runnable() {Overridepublic void run() {System.out.println("2&quo…

電腦技巧:F5稱為萬能鍵,看了才知道它的強大

目錄 NO.1 瀏覽器刷新 NO.2 PPT快速放映 NO.3 Word快速定位 NO.4 Excel快速定位 NO.5 記事本錄入當前時間 今天給大家介紹一個經常被大家忽視的但非常實用的快捷鍵F5具體有哪些用法。 ★萬能快捷鍵★ F5 NO.1 瀏覽器刷新 刷新功能 F5最常用的就是網頁刷新功能&#xff0c;相比這…

學號20145220《信息安全系統設計基礎》第12周學習總結

學號20145220《信息安全系統設計基礎》第12周學習總結 教材學習內容總結 學號20145220《信息安全系統設計基礎》第11周學習總結 - 20145220韓旭飛 - 博客園 http://www.cnblogs.com/hxf5220/p/6107112.html 學號20145220《信息安全系統設計基礎》第10周學習總結 - 20145220韓旭…