spring使用三級緩存解決循環(huán)依賴的情況
更新時間:2025年09月10日 09:40:26 作者:java葉新東老師
Spring 2.6后默認(rèn)禁用循環(huán)依賴,啟動時報錯;可通過@Lazy注解或配置啟用,三級緩存分別存儲完整Bean、部分注入對象和未注入對象,解決依賴注入問題
前言
在spring 2.6之前的版本中,默認(rèn)都是支持循環(huán)依賴的,也就不會報錯,在2.6版本之后默認(rèn)禁用了循環(huán)依賴;可通過以下方式開啟循環(huán)依賴
spring:
main:
allow-circular-references: true # 開啟循環(huán)依賴, false (默認(rèn))表示禁用循環(huán)依賴
復(fù)現(xiàn)
比如有以下2個類,A引用了B,B引用了A;
- A.java
@Service
public class B{
@Autowried
private B b;
}
- B.java
@Service
public class B{
@Autowried
private A a;
}
默認(rèn)情況下啟動spring就會拋出循環(huán)依賴的異常
*************************** APPLICATION FAILED TO START *************************** Description: The dependencies of some of the beans in the application context form a cycle: ┌─────┐ | a (field private com.spring.service.B com.spring.service.A.b) ↑ ↓ | b (field private com.spring.service.A com.spring.service.B.a) └─────┘ Action: Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.
三級緩存
先說下三級緩存的作用
- 一級緩存:存放實例化且屬性已注入完成的Bean(完整對象)
- 二級緩存:存放不完整的對象(屬性已注入了一部分,未全部注入完成)
- 三級緩存:存放剛實例化的空對象(屬性未注入)

- 三級緩存的執(zhí)行流程如下:

解決
這里有2種解決方案
1、添加懶加載注解 @Lazy
用法如下
@Service
public class B {
@Autowired
@Lazy
private A a;
}
2、啟用循環(huán)依賴的配置
在application.yml 文件加上以下配置即可
spring:
main:
allow-circular-references: true
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot?整合mapstruct的實現(xiàn)步驟
這篇文章主要介紹了SpringBoot整合mapstruct,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
Java中關(guān)鍵字final finally finalize的區(qū)別介紹
這篇文章主要給大家分享的是 Java中final,finally,finalize 到底有什么區(qū)別,文章圍繞final,finally,finalize的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考的價值,需要的朋友可以參考一下2022-04-04

