spring使用三級緩存解決循環(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.
三級緩存
先說下三級緩存的作用
- 一級緩存:存放實(shí)例化且屬性已注入完成的Bean(完整對象)
- 二級緩存:存放不完整的對象(屬性已注入了一部分,未全部注入完成)
- 三級緩存:存放剛實(shí)例化的空對象(屬性未注入)

- 三級緩存的執(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)文章
Java concurrency集合之CopyOnWriteArraySet_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
CopyOnWriteArraySet基于CopyOnWriteArrayList實(shí)現(xiàn),其唯一的不同是在add時(shí)調(diào)用的是CopyOnWriteArrayList的addIfAbsent(若沒有則增加)方法2017-06-06
Java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能實(shí)例代碼
在這里,我們使用servlet來實(shí)現(xiàn)隨機(jī)驗(yàn)證碼的實(shí)現(xiàn),有需要的朋友可以參考一下2013-08-08
Spring-data-JPA使用時(shí)碰到的問題以及解決方案
這篇文章主要介紹了Spring-data-JPA使用時(shí)碰到的問題以及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
java實(shí)現(xiàn)切割wav音頻文件的方法詳解【附外部jar包下載】
這篇文章主要介紹了java實(shí)現(xiàn)切割wav音頻文件的方法,結(jié)合實(shí)例形式詳細(xì)分析了java切割wav音頻文件的相關(guān)原理、操作技巧與注意事項(xiàng),并附帶外部jar包供讀者下載,需要的朋友可以參考下2019-05-05
SpringBoot請求發(fā)送與信息響應(yīng)匹配實(shí)現(xiàn)方法介紹
這篇文章主要介紹了SpringBoot請求發(fā)送與信息響應(yīng)匹配實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10
Springboot基于websocket實(shí)現(xiàn)簡單在線聊天功能
這篇文章主要介紹了Springboot基于websocket實(shí)現(xiàn)簡單在線聊天功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Java的Spring框架中DAO數(shù)據(jù)訪問對象的使用示例
這篇文章主要介紹了Java的Spring框架中DAO數(shù)據(jù)訪問對象的使用示例,分為在Spring中DOA與JDBC以及與Hibernate的配合使用兩種情況來進(jìn)行演示,需要的朋友可以參考下2016-03-03
Mybatis-Plus最優(yōu)化持久層開發(fā)過程
Mybatis-plus(簡稱MP)是一個(gè)Mybatis的增強(qiáng)工具,在mybatis的基礎(chǔ)上只做增強(qiáng)不做改變,提高效率,自動(dòng)生成單表的CRUD功能,這篇文章主要介紹了Mybatis-Plus最優(yōu)化持久層開發(fā),需要的朋友可以參考下2024-07-07

