SpringBoot2.6.x默認(rèn)禁用循環(huán)依賴后的問題解決
一、序言
SpringBoot 2.6.x
不推薦使用循環(huán)依賴,這是一個(gè)好消息,SpringBoot從底層逐漸引導(dǎo)開發(fā)者書寫規(guī)范的代碼,同時(shí)也是個(gè)憂傷的消息,循環(huán)依賴的應(yīng)用場景實(shí)在是太廣泛了。
如果從低版本升級(jí)到2.6.x
,那么很大概率遇到的第一個(gè)問題便是循環(huán)依賴問題。
二、問題復(fù)原
1、代碼說明
下面風(fēng)格的代碼比較普遍:兩個(gè)類都有調(diào)用對(duì)方方法的需求,因此很容易寫成循環(huán)引用。
@Service public class TbDeptServiceImpl extends ServiceImpl<TbDeptMapper, TbDept> implements ITbDeptService { @Autowired private ITbStaffService staffService; }
@Service public class TbStaffServiceImpl extends ServiceImpl<TbStaffMapper, TbStaff> implements ITbStaffService { @Autowired private ITbDeptService deptService; }
2、錯(cuò)誤示例
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.
Despite circular references being allowed, the dependency cycle between beans could not be broken. Update your application to remove the dependency cycle.
三、問題解決
1、粗暴解決
最簡單的方式是在全局配置文件中允許循環(huán)引用存在,此屬性默認(rèn)值為false
,顯示聲明為true
,可回避項(xiàng)目啟動(dòng)時(shí)控制臺(tái)循環(huán)引用異常。
spring: main: allow-circular-references: true
2、優(yōu)雅解決
Spring官方默認(rèn)禁止使用循環(huán)依賴,盡管留有可選配置,允許開發(fā)者繼續(xù)使用循環(huán)依賴。
Spring官方的初心是不希望開發(fā)者編寫循環(huán)依賴的代碼,也就是說未來的某個(gè)版本可能強(qiáng)制不得使用循環(huán)依賴,因此逐漸在新項(xiàng)目中消除循環(huán)依賴是不得不面對(duì)的問題。
使用方法的返回值獲取實(shí)例對(duì)象,替換通過成員變量注入實(shí)例對(duì)象。
@Service public class TbDeptServiceImpl extends ServiceImpl<TbDeptMapper, TbDept> implements ITbDeptService { /** * 使用方法返回實(shí)例對(duì)象,替換成員變量注入 * @return ITbStaffService */ public ITbStaffService getStaffService(){ return SpringUtils.getBean(ITbStaffService.class); } }
@Service public class TbStaffServiceImpl extends ServiceImpl<TbStaffMapper, TbStaff> implements ITbStaffService { /** * 使用方法返回實(shí)例對(duì)象,替換成員變量注入 * @return ITbStaffService */ public ITbDeptService getDeptService(){ return SpringUtils.getBean(ITbDeptService.class); } }
其中需要使用如下依賴,此依賴是筆者抽離出來的公共依賴
,可跨項(xiàng)目使用。
<dependency> <groupId>xin.altitude.cms.common</groupId> <artifactId>ucode-cms-common</artifactId> <version>1.3.4</version> </dependency>
如果找不到此依賴,很大可能是阿里云Maven倉庫尚未同步,在項(xiàng)目中強(qiáng)制使用Maven中央倉庫即可。
<repositories> <repository> <id>public</id> <name>maven nexus</name> <url>https://repo1.maven.org/maven2/</url> <snapshots> <updatePolicy>always</updatePolicy> </snapshots> </repository> </repositories>
四、小結(jié)
Spring生態(tài)作為廣泛使用的框架,儼然成為Java企業(yè)級(jí)應(yīng)用主流標(biāo)準(zhǔn),其微小的變化對(duì)整合生態(tài)帶來不可估量的影響。從跟隨者轉(zhuǎn)化為引導(dǎo)者,果斷禁止循環(huán)依賴問題,體現(xiàn)的是作為引導(dǎo)者的擔(dān)當(dāng)。
循環(huán)引用使用習(xí)慣了,初步看起來代碼沒毛病,仔細(xì)想想是不合理的設(shè)計(jì)。循環(huán)依賴的直接表現(xiàn)是你中有我,我中有你
,從對(duì)象的設(shè)計(jì)上令人費(fèi)解。
最為開發(fā)者時(shí)刻關(guān)注底層框架的變動(dòng),將會(huì)在應(yīng)用層收益。這里所說的底層框架是指JDK、Spring生態(tài)、Apache、知名大廠開源并廣泛被應(yīng)用的框架,比如guava等。
到此這篇關(guān)于SpringBoot2.6.x默認(rèn)禁用循環(huán)依賴后的應(yīng)對(duì)策略的文章就介紹到這了,更多相關(guān)SpringBoot2.6.x禁用循環(huán)依賴內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA JeeSite框架httpSession.invalidate()無效問題解決方案
這篇文章主要介紹了IDEA JeeSite框架httpSession.invalidate()無效問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09java字符串日期類Date和Calendar相互轉(zhuǎn)化及相關(guān)常用方法
Java語言的Calendar(日歷),Date(日期),和DateFormat(日期格式)組成了Java標(biāo)準(zhǔn)的一個(gè)基本但是非常重要的部分,下面這篇文章主要給大家介紹了關(guān)于java字符串日期類Date和Calendar相互轉(zhuǎn)化及相關(guān)常用方法的相關(guān)資料,需要的朋友可以參考下2023-12-12圖解Java?ReentrantLock公平鎖和非公平鎖的實(shí)現(xiàn)
ReentrantLock是Java并發(fā)中十分常用的一個(gè)類,具備類似synchronized鎖的作用。但是相比synchronized,?它具備更強(qiáng)的能力,同時(shí)支持公平鎖和非公平鎖。本文就來聊聊ReentrantLock公平鎖和非公平鎖的實(shí)現(xiàn),需要的可以參考一下2022-10-10Java對(duì)日期Date類進(jìn)行加減運(yùn)算、年份加減月份加減、時(shí)間差等等
這篇文章主要介紹了Java對(duì)日期Date類進(jìn)行加減運(yùn)算、年份加減月份加減、時(shí)間差等等,在網(wǎng)上查閱資料,加上自己總結(jié)的一些關(guān)于Date類的工具類2017-01-01ssm項(xiàng)目實(shí)現(xiàn)用戶登陸持久化(token)
這篇文章主要介紹了ssm項(xiàng)目實(shí)現(xiàn)用戶登陸持久化(token),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java實(shí)現(xiàn)摳圖片文字或簽名的完整代碼
這篇文章主要介紹了java摳圖片文字或簽名的運(yùn)行原理,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06淺談SpringMVC HandlerInterceptor詭異問題排查
這篇文章主要介紹了淺談SpringMVC HandlerInterceptor詭異問題排查,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05Spring?Boot實(shí)現(xiàn)WebSocket實(shí)時(shí)通信
本文主要介紹了Spring?Boot實(shí)現(xiàn)WebSocket實(shí)時(shí)通信,包含實(shí)現(xiàn)實(shí)時(shí)消息傳遞和群發(fā)消息等功能,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05