亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

引言

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

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ù)測的行為,如NPE(NullPointerException)或初始化順序問題。

2. 案例一:Shiro與Service層的循環(huá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)依賴問題:

  • 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
    // 改為通過方法參數(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會在Bean初始化后再注入依賴
    public void setSysRoleService(SysRoleService sysRoleService) {
        this.sysRoleService = sysRoleService;
    }
}

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

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

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

問題分析

錯(cuò)誤日志:

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

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

解決方案

(1) 升級 PageHelper 版本

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

(2) 排除自動配置

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

(3) 手動配置 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

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

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

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

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

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

相關(guān)文章

  • 使用springBoot中的info等級通過druid打印sql

    使用springBoot中的info等級通過druid打印sql

    這篇文章主要介紹了使用springBoot中的info等級通過druid打印sql,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • RestTemplate請求失敗自動重啟機(jī)制精講

    RestTemplate請求失敗自動重啟機(jī)制精講

    這篇文章主要為大家介紹了RestTemplate請求失敗自定義處理的方法,自動重試的機(jī)制精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多所進(jìn)步,早日升職加薪
    2022-03-03
  • Mybatis反向工程出現(xiàn)BigDecimal類型問題及解決

    Mybatis反向工程出現(xiàn)BigDecimal類型問題及解決

    這篇文章主要介紹了Mybatis反向工程出現(xiàn)BigDecimal類型問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Java實(shí)現(xiàn)選擇排序

    Java實(shí)現(xiàn)選擇排序

    這篇文章主要介紹了Java實(shí)現(xiàn)選擇排序,把一列數(shù)組按從小到大或從大到小排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 使用spring注入枚舉類型作為參數(shù)

    使用spring注入枚舉類型作為參數(shù)

    這篇文章主要介紹了使用spring注入枚舉類型作為參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • IDEA操作MongoDB及安全認(rèn)證方式

    IDEA操作MongoDB及安全認(rèn)證方式

    這篇文章主要介紹了IDEA操作MongoDB及安全認(rèn)證方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 聊聊Java三種常見的分布式鎖

    聊聊Java三種常見的分布式鎖

    目前分布式鎖的實(shí)現(xiàn)方案主要包括三種,本文就來介紹一下這三種常見的分布式鎖以及這三種鎖的性能等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-06-06
  • SpringMVC實(shí)現(xiàn)Controller的三種方式總結(jié)

    SpringMVC實(shí)現(xiàn)Controller的三種方式總結(jié)

    這篇文章主要介紹了SpringMVC實(shí)現(xiàn)Controller的三種方式總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot實(shí)現(xiàn)字段自動填充的兩種方式

    SpringBoot實(shí)現(xiàn)字段自動填充的兩種方式

    每個(gè)字段在插入數(shù)據(jù)庫,或者更新時(shí)都要在serviceimpl層對creatby,updateby等字段進(jìn)行填充,這個(gè)太繁瑣了,所以本文給大家介紹了SpringBoot實(shí)現(xiàn)字段自動填充的兩種方式,需要的朋友可以參考下
    2024-11-11
  • Java實(shí)現(xiàn)中英文詞典功能

    Java實(shí)現(xiàn)中英文詞典功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)中英文詞典功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論