色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SpringBoot循環依賴的癥狀和解決方案

Android編程精選 ? 來源:CSDN-熊貓Jay ? 2023-05-06 15:30 ? 次閱讀

什么是循環依賴?

循環依賴是指在Spring Boot 應用程序中,兩個或多個類之間存在彼此依賴的情況,形成一個循環依賴鏈。

在這種情況下,當一個類在初始化時需要另一個類的實例,而另一個類又需要第一個類的實例時,就會出現循環依賴問題。這會導致應用程序無法正確地初始化和運行,因為Spring Boot 無法處理這種循環依賴關系。

問題及癥狀

在2.6.0之前,Spring Boot會自動處理循環依賴的問題。2.6.0及之后的版本會默認檢查循環依賴,存在該問題則會報錯。

ComponentA類注入ComponentB類,ComponentB類注入ComponentA類,就會發生循環依賴的問題。

ComponentA

importorg.springframework.stereotype.Service;
importjavax.annotation.Resource;

@Service
publicclassComponentA{

@Resource
privateComponentBcomponentB;

}

ComponentB

importorg.springframework.stereotype.Service;
importjavax.annotation.Resource;

@Service
publicclassComponentB{

@Resource
privateComponentAcomponentA;

}

錯誤

現在,2.6.0 這個版本已經默認禁止 Bean 之間的循環引用, 則基于上面的代碼,會報錯:

***************************
APPLICATIONFAILEDTOSTART
***************************

Description:

Thedependenciesofsomeofthebeansintheapplicationcontextformacycle:

┌─────┐
|componentA
↑↓
|componentB
└─────┘


Action:

Relyinguponcircularreferencesisdiscouragedandtheyareprohibitedbydefault.Updateyourapplicationtoremovethedependencycyclebetweenbeans.Asalastresort,itmaybepossibletobreakthecycleautomaticallybysettingspring.main.allow-circular-referencestotrue.

解決方法

循環依賴是指兩個或更多的組件之間存在著互相依賴的關系。在Spring Boot應用程序中,循環依賴通常是由以下幾種情況引起的:

構造函數循環依賴: 兩個或更多的組件在它們的構造函數中互相依賴。

屬性循環依賴: 兩個或更多的組件在它們的屬性中互相依賴。

方法循環依賴: 兩個或更多的組件在它們的方法中互相依賴。

Spring Boot提供了一些解決循環依賴的方法:

構造函數注入: 在構造函數中注入依賴項,而不是在屬性中注入。

Setter注入: 使用setter方法注入依賴項,而不是在構造函數中注入。

延遲注入: 使用@Lazy注解延遲加載依賴項。

@Autowired注解的required屬性: 將required屬性設置為false,以避免出現循環依賴問題。

@DependsOn注解: 使用@DependsOn注解指定依賴項的加載順序,以避免出現循環依賴問題

構造器注入的案例

假設有以下兩個類:

publicclassA{
privateBb;

publicA(){
//...
}

publicvoidsetB(Bb){
this.b=b;
}
}

publicclassB{
privateAa;

publicB(){
//...
}

publicvoidsetA(Aa){
this.a=a;
}
}

通過構造函數注入可以避免循環依賴,改造后的代碼如下:

publicclassA{
privateBb;

publicA(Bb){
this.b=b;
}
}

publicclassB{
privateAa;

publicB(Aa){
this.a=a;
}
}

這樣,在創建 A 實例時,只需要將 B 實例傳遞給 A 的構造函數即可,不需要再通過 setter 方法將 B 實例注入到 A 中。同理,在創建 B 實例時,只需要將 A 實例傳遞給 B 的構造函數即可,不需要再通過 setter 方法將 A 實例注入到 B 中。這樣可以避免循環依賴。

延遲注入的案例

假設有如下情景:

類A依賴于類B,同時類B也依賴于類A。這樣就形成了循環依賴。

為了解決這個問題,可以使用@Lazy注解,將類A或類B中的其中一個延遲加載。

例如,我們可以在類A中使用@Lazy注解,將類A延遲加載,這樣在啟動應用程序時,Spring容器不會立即加載類A,而是在需要使用類A的時候才會進行加載。這樣就避免了循環依賴的問題。

示例代碼如下:

@Component
publicclassA{

privatefinalBb;

publicA(@LazyBb){
this.b=b;
}

//...
}

@Component
publicclassB{

privatefinalAa;

publicB(Aa){
this.a=a;
}

//...
}

在類A中,我們使用了@Lazy注解,將類B延遲加載。這樣在啟動應用程序時,Spring容器不會立即加載類B,而是在需要使用類B的時候才會進行加載。

這樣就避免了類A和類B之間的循環依賴問題。

接口隔離的案例

假設有兩個類A和B,它們之間存在循環依賴:

publicclassA{
privatefinalBb;
publicA(Bb){
this.b=b;
}
}

publicclassB{
privatefinalAa;
publicB(Aa){
this.a=a;
}
}

這時候,如果直接在Spring Boot中注入A和B,就會出現循環依賴的問題。為了解決這個問題,可以使用接口隔離。

首先,定義一個接口,包含A和B類中需要使用的方法:

publicinterfaceService{
voiddoSomething();
}

然后,在A和B類中分別注入Service接口:

publicclassA{
privatefinalServiceservice;
publicA(Serviceservice){
this.service=service;
}
}

publicclassB{
privatefinalServiceservice;
publicB(Serviceservice){
this.service=service;
}
}

最后,在Spring Boot中注入Service實現類:

@Service
publicclassServiceImplimplementsService{
privatefinalAa;
privatefinalBb;
publicServiceImpl(Aa,Bb){
this.a=a;
this.b=b;
}
@Override
publicvoiddoSomething(){
//...
}
}

通過這種方式,A和B類不再直接依賴于彼此,而是依賴于同一個接口。同時,Spring Boot也能夠正確地注入A、B和ServiceImpl,避免了循環依賴的問題。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8775

    瀏覽量

    152397
  • 函數
    +關注

    關注

    3

    文章

    4353

    瀏覽量

    63296
  • 應用程序
    +關注

    關注

    38

    文章

    3305

    瀏覽量

    58203
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14575
  • Boot
    +關注

    關注

    0

    文章

    150

    瀏覽量

    36125
  • SpringBoot
    +關注

    關注

    0

    文章

    175

    瀏覽量

    217

原文標題:SpringBoot 循環依賴的癥狀和解決方案

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    2009最新LED路燈技術設計和解決方案

    2009年11月19-20日,OFweek光電新聞網,LEDWeekly將舉辦“2009最新LED路燈技術設計和解決方案”系列在線研討會。歡迎朋友們參加, 詳細情況看這里~: http://webinar.ofweek.com/index.action?user.id=2 有興趣的朋友可以來參加! 
    發表于 11-08 23:57

    儀表放大器--常見的應用問題和解決方案

    儀表放大器--常見的應用問題和解決方案很完整的資料!
    發表于 12-15 09:53

    無線傳感器網絡的挑戰和解決方案

    無線傳感器網絡的挑戰和解決方案
    發表于 09-17 06:53

    EMI耦合類型和解決方案

    、高性能和解決方案尺寸三個考慮因素通常相互沖突:只能優先考慮一兩個,而放棄第三個,尤其當設計期限臨近時。犧牲一些性能變得司空見慣;其實不應該是這樣的。。
    發表于 10-22 14:10

    SpringBoot 學習筆記

    SpringBoot 學習筆記 【整合JWT】添加依賴創建工具類登錄獲取jwt使用jwtDemo源碼參考資料添加依賴pom.xml...com.auth0java-jwt3.12.0
    發表于 07-01 07:27

    springboot集成mqtt

    springboot集成mqtt,大綱一.數據入庫1.數據入庫解決方案二.開發實時訂閱發布展示頁面1.及時通訊技術2.技術整合
    發表于 07-16 07:53

    ADI鋰電池測試設備和解決方案

    ADI鋰電池測試設備和解決方案
    發表于 09-08 16:23 ?15次下載
    ADI鋰電池測試設備<b class='flag-5'>和解決方案</b>

    PFC+LLC的產品和解決方案分析

    PFC LLC英雄產品和解決方案
    的頭像 發表于 05-29 09:05 ?1.1w次閱讀
    PFC+LLC的產品<b class='flag-5'>和解決方案</b>分析

    Java:調用window的matlab遇到的問題和解決方案

    Java:調用window的matlab遇到的問題和解決方案
    的頭像 發表于 06-20 09:32 ?3443次閱讀
    Java:調用window的matlab遇到的問題<b class='flag-5'>和解決方案</b>

    無線傳感器網絡的挑戰和解決方案

    無線傳感器網絡的挑戰和解決方案
    發表于 03-19 04:28 ?4次下載
    無線傳感器網絡的挑戰<b class='flag-5'>和解決方案</b>

    AN-1429: 手機中耳機驅動的設計考慮和解決方案

    AN-1429: 手機中耳機驅動的設計考慮和解決方案
    發表于 03-20 13:06 ?7次下載
    AN-1429: 手機中耳機驅動的設計考慮<b class='flag-5'>和解決方案</b>

    無線傳感器網絡的挑戰和解決方案

    無線傳感器網絡的挑戰和解決方案
    發表于 03-21 13:41 ?1次下載
    無線傳感器網絡的挑戰<b class='flag-5'>和解決方案</b>

    高可靠性組件和解決方案

    高可靠性組件和解決方案
    發表于 04-26 14:38 ?6次下載
    高可靠性組件<b class='flag-5'>和解決方案</b>

    關于Spring的循環依賴問題

      Spring 的循環依賴,源碼詳細分析 → 真的非要三級緩存嗎 中講到了循環依賴問題
    的頭像 發表于 06-14 17:21 ?1838次閱讀

    PCB金手指設計的常見問題和解決方案

    PCB金手指設計的常見問題和解決方案
    的頭像 發表于 12-25 10:09 ?2892次閱讀
    主站蜘蛛池模板: 国产精品人妻在线观看 | 把极品白丝班长啪到腿软 | 久久综合色视频 | 亚洲国产成人综合 | 午夜dj免费中文字幕 | 达达兔欧美午夜国产亚洲 | 国产亚洲精品久久久久久久 | 九九热视频 这里有精品 | 狠狠干.in| 香蕉鱼视频观看在线视频下载 | 伊在香蕉国产在线视频 | 在教室做啊好大用力 | 2020精品国产视 | 精品四虎国产在免费观看 | 日韩精品AV一区二区三区 | 骚浪插深些好烫喷了 | 国产精品无码亚洲区艳妇 | 亚洲XXX午休国产熟女屁 | 老师那里好大又粗h男男 | 高清无码色大片中文 | 石原莉奈rbd806中文字幕 | 岳打开双腿开始配合日韩视频 | 男人吃奶摸下弄进去好爽 | 一边摸一边桶一边脱免费 | 麻豆XXXX乱女少妇精品-百度 | 高清撒尿hdtube撒尿 | 国产亚洲精品成人a在线 | 国产在线高清视频无码不卡 | 精品日韩欧美一区二区三区 | 午夜人妻理论片天堂影院 | 国产乱人伦AV麻豆网 | gayxxxxgay呻吟受日本 | 国产亚洲视频在线观看 | 午夜日本大胆裸艺术 | 亚洲综合中文字幕无线码 | 嫩草影院久久国产精品 | 国产成+人欧美+综合在线观看 | 国产精品1卡二卡三卡四卡乱码 | 国产在线观看www鲁啊鲁免费 | 最美女人体内射精一区二区 | 入禽太深免费视频10 |