【Spring Boot】Spring Boot解决循环依赖

循环依赖的概念

循环依赖指的是两个或多个Bean相互依赖,形成闭环。例如Bean A依赖Bean B,Bean B又依赖Bean A,导致Spring无法正常初始化这些Bean。Spring Boot默认情况下会检测并抛出BeanCurrentlyInCreationException异常。

使用构造器注入的解决方案

构造器注入是Spring推荐的依赖注入方式,但构造器注入无法直接解决循环依赖问题。需要通过以下方式调整:

  • 将部分依赖改为Setter注入字段注入,延迟依赖的解析。
  • 使用@Lazy注解,延迟加载其中一个Bean,打破初始化时的循环。

示例代码:

java 复制代码
@Service
public class ServiceA {
    private final ServiceB serviceB;
    
    @Autowired
    public ServiceA(@Lazy ServiceB serviceB) {
        this.serviceB = serviceB;
    }
}

使用Setter或字段注入

通过Setter或字段注入可以避免构造器注入的严格初始化顺序问题:

java 复制代码
@Service
public class ServiceA {
    @Autowired
    private ServiceB serviceB;
}

@Service
public class ServiceB {
    @Autowired
    private ServiceA serviceA;
}

配置Spring Boot允许循环依赖

在Spring Boot 2.6及以上版本中,默认禁止循环依赖。可以通过配置调整:

properties 复制代码
spring.main.allow-circular-references=true

重构设计避免循环依赖

  • 提取公共逻辑到第三个Bean中,解除直接循环。
  • 使用事件驱动(ApplicationEventPublisher)解耦Bean间的直接调用。
  • 将依赖关系改为单向依赖,例如通过接口隔离。

使用@DependsOn明确初始化顺序

通过@DependsOn强制指定Bean的初始化顺序,但需谨慎使用:

java 复制代码
@Service
@DependsOn("serviceB")
public class ServiceA {
    // ...
}

关键注意事项

  • Spring Boot 2.6+默认禁止循环依赖,优先考虑重构设计。
  • @Lazy注解适用于临时解决方案,但可能掩盖设计问题。
  • 循环依赖可能导致难以维护的代码,建议通过模块化设计规避。
相关推荐
悲且狂9 分钟前
SpringBoot项目改造注意事项(旧项目框架复用)
java·spring boot·后端
SQL-First布道者5 小时前
⚡Spring JDBC 完整体系 · 第 10 集 · 手搓 `BaseCondition`
java·spring boot·后端·spring·mybatis·spring jdbc
2601_962074686 小时前
Spring Boot的无缝衔接:深入解析与实践
数据库·spring boot·后端
南城以南溫暖如初1476 小时前
社交裂变商城系统设计与实战开发指南
java·spring boot·mysql·vue·mybatis
xiaoqiMikko6 小时前
Spring 官方给 5.3 线开了三个修复版,Maven Central 上一个都没有
java·spring boot
南城以南溫暖如初1476 小时前
分享返现商城系统开发实战:技术架构与运营经验指南
java·spring boot·mysql·架构·vue·mybatis
vipxieliang7 小时前
Java切面编程(AOP)详解:从核心概念到实战应用
java·spring boot
.Hypocritical.7 小时前
SpringBoot 各版本 Profile 多环境配置完整对比(2.x/ 2.4+ / 3.x/4.x
java·spring boot·后端
南城以南溫暖如初1478 小时前
社群电商实战指南:从零搭建高转化社区的技术架构
java·spring boot·mysql·系统架构·vue·mybatis
南城以南溫暖如初1478 小时前
会员返利商城系统开发实战:架构设计与实现指南
java·spring boot·mysql·vue·mybatis