溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決SpringBoot2.6.x默認禁用循環(huán)依賴后的問題

發(fā)布時間:2022-02-23 11:50:56 來源:億速云 閱讀:1196 作者:小新 欄目:開發(fā)技術

這篇文章主要介紹了如何解決SpringBoot2.6.x默認禁用循環(huán)依賴后的問題,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    一、序言

    SpringBoot 2.6.x不推薦使用循環(huán)依賴,這是一個好消息,SpringBoot從底層逐漸引導開發(fā)者書寫規(guī)范的代碼,同時也是個憂傷的消息,循環(huán)依賴的應用場景實在是太廣泛了。

    如果從低版本升級到2.6.x,那么很大概率遇到的第一個問題便是循環(huán)依賴問題。

    二、問題復原

    1、代碼說明

    下面風格的代碼比較普遍:兩個類都有調用對方方法的需求,因此很容易寫成循環(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>

    四、小結

    Spring生態(tài)作為廣泛使用的框架,儼然成為Java企業(yè)級應用主流標準,其微小的變化對整合生態(tài)帶來不可估量的影響。從跟隨者轉化為引導者,果斷禁止循環(huán)依賴問題,體現的是作為引導者的擔當。

    循環(huán)引用使用習慣了,初步看起來代碼沒毛病,仔細想想是不合理的設計。循環(huán)依賴的直接表現是你中有我,我中有你,從對象的設計上令人費解。

    最為開發(fā)者時刻關注底層框架的變動,將會在應用層收益。這里所說的底層框架是指JDK、Spring生態(tài)、Apache、知名大廠開源并廣泛被應用的框架,比如guava等。

    感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何解決SpringBoot2.6.x默認禁用循環(huán)依賴后的問題”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI