最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深度解析SpringBoot循環(huán)依賴問(wèn)題與解決

 更新時(shí)間:2025年06月11日 08:04:42   作者:碼農(nóng)阿豪@新空間  
在Spring Boot開(kāi)發(fā)過(guò)程中,循環(huán)依賴(Circular Dependency)是一個(gè)常見(jiàn)但棘手的問(wèn)題,本文將通過(guò)兩個(gè)典型案例,深入分析循環(huán)依賴問(wèn)題的根源,并提供多種解決方案,希望對(duì)大家有所幫助

引言

在Spring Boot開(kāi)發(fā)過(guò)程中,循環(huán)依賴(Circular Dependency)是一個(gè)常見(jiàn)但棘手的問(wèn)題。當(dāng)兩個(gè)或多個(gè)Bean相互依賴時(shí),Spring容器無(wú)法確定初始化順序,導(dǎo)致應(yīng)用啟動(dòng)失敗。本文將通過(guò)兩個(gè)典型案例,深入分析循環(huán)依賴問(wèn)題的根源,并提供多種解決方案,幫助開(kāi)發(fā)者徹底理解和解決這類問(wèn)題。

1. 什么是循環(huán)依賴

循環(huán)依賴是指兩個(gè)或多個(gè)Bean相互引用,形成閉環(huán)依賴關(guān)系。例如:

  • BeanA 依賴 BeanB
  • BeanB 依賴 BeanC
  • BeanC 又依賴 BeanA

Spring默認(rèn)禁止循環(huán)依賴,因?yàn)樗赡軐?dǎo)致不可預(yù)測(cè)的行為,如NPE(NullPointerException)或初始化順序問(wèn)題。

2. 案例一:Shiro與Service層的循環(huán)依賴

問(wèn)題分析

錯(cuò)誤日志如下:

The dependencies of some of the beans in the application context form a cycle:
   shirFilter → securityManager → userRealm → sysUserService → sysRoleService → sysUserService

這是一個(gè)典型的服務(wù)層與Shiro安全框架的循環(huán)依賴問(wèn)題:

  • ShiroFilter 依賴 SecurityManager
  • SecurityManager 依賴 UserRealm
  • UserRealm 依賴 SysUserService
  • SysUserService 依賴 SysRoleService
  • SysRoleService 又依賴 SysUserService,形成閉環(huán)。

解決方案

(1) 重構(gòu)代碼,消除循環(huán)依賴(推薦)

// 將 SysUserService 和 SysRoleService 的相互依賴改為單向依賴
@Service
public class SysUserServiceImpl implements SysUserService {
    // 不再直接依賴 SysRoleService
    // 改為通過(guò)方法參數(shù)傳入
    public void someMethod(SysRoleService roleService) {
        // ...
    }
}

(2) 使用 @Lazy 延遲加載

@Service
public class SysUserServiceImpl implements SysUserService {
    @Lazy  // 延遲注入,避免循環(huán)依賴
    @Autowired
    private SysRoleService sysRoleService;
}

(3) 使用 Setter 注入替代字段注入

@Service
public class SysUserServiceImpl implements SysUserService {
    private SysRoleService sysRoleService;

    @Autowired  // 使用Setter注入,Spring會(huì)在Bean初始化后再注入依賴
    public void setSysRoleService(SysRoleService sysRoleService) {
        this.sysRoleService = sysRoleService;
    }
}

(4) 臨時(shí)啟用循環(huán)引用(不推薦)

# application.properties
spring.main.allow-circular-references=true

3. 案例二:PageHelper自動(dòng)配置循環(huán)依賴

問(wèn)題分析

錯(cuò)誤日志:

The dependencies of some of the beans in the application context form a cycle:
   com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration

這個(gè)問(wèn)題通常是由于 PageHelper 版本與 Spring Boot 不兼容,或者自動(dòng)配置類自身存在循環(huán)引用。

解決方案

(1) 升級(jí) PageHelper 版本

<!-- pom.xml -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.6</version> <!-- 推薦使用最新穩(wěn)定版 -->
</dependency>

(2) 排除自動(dòng)配置

@SpringBootApplication(exclude = PageHelperAutoConfiguration.class)
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

(3) 手動(dòng)配置 PageHelper

@Configuration
public class PageHelperConfig {
    @Bean
    public PageInterceptor pageInterceptor() {
        PageInterceptor interceptor = new PageInterceptor();
        Properties props = new Properties();
        props.setProperty("helperDialect", "mysql");
        props.setProperty("reasonable", "true");
        interceptor.setProperties(props);
        return interceptor;
    }
}

(4) 檢查依賴沖突

mvn dependency:tree

確保沒(méi)有引入多個(gè)不同版本的PageHelper。

4. 循環(huán)依賴的通用解決策略

方案適用場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)
重構(gòu)代碼長(zhǎng)期項(xiàng)目徹底解決問(wèn)題可能需要較大改動(dòng)
@Lazy簡(jiǎn)單循環(huán)依賴改動(dòng)小可能隱藏設(shè)計(jì)問(wèn)題
Setter注入需要控制初始化順序符合Spring推薦方式代碼稍顯冗長(zhǎng)
允許循環(huán)引用緊急修復(fù)快速解決不推薦長(zhǎng)期使用

5. 最佳實(shí)踐與總結(jié)

最佳實(shí)踐

避免雙向依賴:盡量采用單向依賴,如 A → B,而不是 A ↔ B。

使用接口分離:將公共邏輯提取到單獨(dú)接口,減少耦合。

優(yōu)先使用構(gòu)造器注入:

@Service
public class MyService {
    private final OtherService otherService;
    
    @Autowired
    public MyService(OtherService otherService) {
        this.otherService = otherService;
    }
}

定期檢查依賴沖突:使用 mvn dependency:tree 或 gradle dependencies。

總結(jié)

循環(huán)依賴問(wèn)題雖然常見(jiàn),但通過(guò)合理的架構(gòu)設(shè)計(jì)、依賴管理和Spring提供的機(jī)制(如@Lazy、Setter注入),可以有效解決。長(zhǎng)期來(lái)看,重構(gòu)代碼、優(yōu)化設(shè)計(jì)是最佳方案,而臨時(shí)方案(如allow-circular-references)僅適用于緊急修復(fù)。

到此這篇關(guān)于深度解析SpringBoot循環(huán)依賴問(wèn)題與解決的文章就介紹到這了,更多相關(guān)SpringBoot循環(huán)依賴內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java檢查IPv6地址的合法性

    基于Java檢查IPv6地址的合法性

    這篇文章主要介紹了基于Java檢查IPv6地址的合法性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 詳解Java單例模式的實(shí)現(xiàn)與原理剖析

    詳解Java單例模式的實(shí)現(xiàn)與原理剖析

    單例模式是Java中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。本文將詳解單例模式的實(shí)現(xiàn)及原理剖析,需要的可以參考一下
    2022-05-05
  • java中vector與hashtable操作實(shí)例分享

    java中vector與hashtable操作實(shí)例分享

    java中vector與hashtable操作實(shí)例,有需要的朋友可以參考一下
    2014-01-01
  • Java 10的10個(gè)新特性總結(jié)

    Java 10的10個(gè)新特性總結(jié)

    這篇文章我們給大家整理了關(guān)于Java 10的10個(gè)新特性以及相關(guān)要點(diǎn)內(nèi)容,有興趣的朋友們可以參考下。
    2018-08-08
  • Java資源加載機(jī)制及使用最佳實(shí)踐

    Java資源加載機(jī)制及使用最佳實(shí)踐

    Java類加載器的資源加載機(jī)制,包括`getResource`、`getResources`、`findResource`、`findResources`等方法,本文給大家介紹Java資源加載機(jī)制及使用最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 如何使用Idea中的 Deployment 實(shí)現(xiàn)打包自動(dòng)部署

    如何使用Idea中的 Deployment 實(shí)現(xiàn)打包自動(dòng)部署

    這篇文章主要介紹了使用Idea中的 Deployment 實(shí)現(xiàn)打包自動(dòng)部署,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 使用springBoot中的info等級(jí)通過(guò)druid打印sql

    使用springBoot中的info等級(jí)通過(guò)druid打印sql

    這篇文章主要介紹了使用springBoot中的info等級(jí)通過(guò)druid打印sql,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet

    Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet

    這篇文章主要介紹了Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet,EnumMap即屬于一個(gè)Map,下文圍繞主題展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴可以參考參考一下
    2022-05-05
  • 使用easyexcel導(dǎo)出的excel文件,使用poi讀取時(shí)異常處理方案

    使用easyexcel導(dǎo)出的excel文件,使用poi讀取時(shí)異常處理方案

    這篇文章主要介紹了使用easyexcel導(dǎo)出的excel文件,使用poi讀取時(shí)異常處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 使用Spring MVC實(shí)現(xiàn)雙向數(shù)據(jù)綁定

    使用Spring MVC實(shí)現(xiàn)雙向數(shù)據(jù)綁定

    Spring MVC是一個(gè)廣泛用于構(gòu)建Java Web應(yīng)用程序的框架,它提供了眾多功能,包括雙向數(shù)據(jù)綁定,在這篇文章中,我們將向Java新手介紹如何使用Spring MVC實(shí)現(xiàn)雙向數(shù)據(jù)綁定,以及為什么這個(gè)特性如此重要,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

武宁县| 大石桥市| 龙海市| 韩城市| 石城县| 锦屏县| 汾西县| 于田县| 浑源县| 甘谷县| 台东县| 白沙| 景洪市| 游戏| 昭苏县| 崇礼县| 崇文区| 平遥县| 化州市| 新巴尔虎右旗| 稻城县| 焦作市| 汉沽区| 庆阳市| 获嘉县| 延边| 光山县| 瑞丽市| 太仆寺旗| 昌黎县| 儋州市| 玛纳斯县| 万山特区| 永泰县| 永顺县| 夏河县| 安平县| 肥东县| 民丰县| 平遥县| 苍山县|