spring使用三級(jí)緩存解決循環(huán)依賴的情況
前言
在spring 2.6之前的版本中,默認(rèn)都是支持循環(huán)依賴的,也就不會(huì)報(bào)錯(cuò),在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個(gè)類,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)情況下啟動(dòng)spring就會(huì)拋出循環(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.
三級(jí)緩存
先說下三級(jí)緩存的作用
- 一級(jí)緩存:存放實(shí)例化且屬性已注入完成的Bean(完整對(duì)象)
- 二級(jí)緩存:存放不完整的對(duì)象(屬性已注入了一部分,未全部注入完成)
- 三級(jí)緩存:存放剛實(shí)例化的空對(duì)象(屬性未注入)

- 三級(jí)緩存的執(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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot?整合mapstruct的實(shí)現(xiàn)步驟
這篇文章主要介紹了SpringBoot整合mapstruct,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
java基礎(chǔ)之泛型知識(shí)點(diǎn)總結(jié)
這篇文章主要介紹了java基礎(chǔ)之泛型知識(shí)點(diǎn)總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04
springboot項(xiàng)目突然啟動(dòng)緩慢的解決
這篇文章主要介紹了springboot項(xiàng)目突然啟動(dòng)緩慢的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java?中向?Arraylist?添加對(duì)象的示例代碼
本文介紹了如何在 Java 中向 ArrayList 添加對(duì)象,并提供了示例和注意事項(xiàng),通過掌握這些知識(shí),讀者可以在自己的 Java 項(xiàng)目中有效地使用 ArrayList 來存儲(chǔ)和操作對(duì)象,需要的朋友可以參考下2023-11-11
Java中關(guān)鍵字final finally finalize的區(qū)別介紹
這篇文章主要給大家分享的是 Java中final,finally,finalize 到底有什么區(qū)別,文章圍繞final,finally,finalize的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考的價(jià)值,需要的朋友可以參考一下2022-04-04

