SpringBoot2.6.x默認禁用循環(huán)依賴后的問題解決
一、序言
SpringBoot 2.6.x
不推薦使用循環(huán)依賴,這是一個好消息,SpringBoot從底層逐漸引導(dǎo)開發(fā)者書寫規(guī)范的代碼,同時也是個憂傷的消息,循環(huán)依賴的應(yīng)用場景實在是太廣泛了。
如果從低版本升級到2.6.x
,那么很大概率遇到的第一個問題便是循環(huán)依賴問題。
二、問題復(fù)原
1、代碼說明
下面風(fēng)格的代碼比較普遍:兩個類都有調(diào)用對方方法的需求,因此很容易寫成循環(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、錯誤示例
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)引用存在,此屬性默認值為false
,顯示聲明為true
,可回避項目啟動時控制臺循環(huán)引用異常。
spring: main: allow-circular-references: true
2、優(yōu)雅解決
Spring官方默認禁止使用循環(huán)依賴,盡管留有可選配置,允許開發(fā)者繼續(xù)使用循環(huán)依賴。
Spring官方的初心是不希望開發(fā)者編寫循環(huán)依賴的代碼,也就是說未來的某個版本可能強制不得使用循環(huán)依賴,因此逐漸在新項目中消除循環(huán)依賴是不得不面對的問題。
使用方法的返回值獲取實例對象,替換通過成員變量注入實例對象。
@Service public class TbDeptServiceImpl extends ServiceImpl<TbDeptMapper, TbDept> implements ITbDeptService { /** * 使用方法返回實例對象,替換成員變量注入 * @return ITbStaffService */ public ITbStaffService getStaffService(){ return SpringUtils.getBean(ITbStaffService.class); } }
@Service public class TbStaffServiceImpl extends ServiceImpl<TbStaffMapper, TbStaff> implements ITbStaffService { /** * 使用方法返回實例對象,替換成員變量注入 * @return ITbStaffService */ public ITbDeptService getDeptService(){ return SpringUtils.getBean(ITbDeptService.class); } }
其中需要使用如下依賴,此依賴是筆者抽離出來的公共依賴
,可跨項目使用。
<dependency> <groupId>xin.altitude.cms.common</groupId> <artifactId>ucode-cms-common</artifactId> <version>1.3.4</version> </dependency>
如果找不到此依賴,很大可能是阿里云Maven倉庫尚未同步,在項目中強制使用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è)級應(yīng)用主流標準,其微小的變化對整合生態(tài)帶來不可估量的影響。從跟隨者轉(zhuǎn)化為引導(dǎo)者,果斷禁止循環(huán)依賴問題,體現(xiàn)的是作為引導(dǎo)者的擔(dān)當。
循環(huán)引用使用習(xí)慣了,初步看起來代碼沒毛病,仔細想想是不合理的設(shè)計。循環(huán)依賴的直接表現(xiàn)是你中有我,我中有你
,從對象的設(shè)計上令人費解。
最為開發(fā)者時刻關(guān)注底層框架的變動,將會在應(yīng)用層收益。這里所說的底層框架是指JDK、Spring生態(tài)、Apache、知名大廠開源并廣泛被應(yīng)用的框架,比如guava等。
到此這篇關(guān)于SpringBoot2.6.x默認禁用循環(huán)依賴后的應(yīng)對策略的文章就介紹到這了,更多相關(guān)SpringBoot2.6.x禁用循環(huán)依賴內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java批量向PDF文件中添加圖像水印實現(xiàn)細節(jié)
這篇文章主要為大家介紹了Java批量向PDF文件中添加圖像水印實現(xiàn)細節(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05Java框架Quartz中API、Jobs和Trigger詳解
這篇文章主要介紹了Java框架Quartz中API、Jobs和Trigger詳解,JobDetail?對象是在將?job?加入?scheduler?時,由客戶端程序(你的程序)創(chuàng)建的,它包含?job?的各種屬性設(shè)置,以及用于存儲?job?實例狀態(tài)信息的?JobDataMap,需要的朋友可以參考下2023-11-11Java ArrayList add(int index, E element)和set(int index, E el
今天小編就為大家分享一篇關(guān)于Java ArrayList add(int index, E element)和set(int index, E element)兩個方法的說明,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10Spring?Boot應(yīng)用程序中如何使用Keycloak詳解
這篇文章主要為大家介紹了Spring?Boot應(yīng)用程序中如何使用Keycloak詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-052種Java刪除ArrayList中的重復(fù)元素的方法
這篇文章主要介紹了2種Java刪除ArrayList中的重復(fù)元素的方法,感興趣的朋友可以參考下2015-08-08Mybatis-Plus中Mapper的接口文件與xml文件相關(guān)的坑記錄
這篇文章主要介紹了Mybatis-Plus中Mapper的接口文件與xml文件相關(guān)的坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Eclipse配置python開發(fā)環(huán)境過程圖解
這篇文章主要介紹了Eclipse配置python開發(fā)環(huán)境過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03java.lang.UnsupportedOperationException分析及解決辦法
日常開發(fā)中我遇到j(luò)ava.lang.UnsupportedOperationException:異常兩次了,下面這篇文章主要給對大家介紹了關(guān)于java.lang.UnsupportedOperationException分析及解決辦法,需要的朋友可以參考下2024-03-03