【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注解适用于临时解决方案,但可能掩盖设计问题。
  • 循环依赖可能导致难以维护的代码,建议通过模块化设计规避。
相关推荐
paopaokaka_luck11 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
SL_staff11 小时前
JVS混合架构实践:能力引擎+动态模型如何支撑企业级可持续交付
spring boot·低代码·全栈
迪飞特科技11 小时前
智慧物业平台实战:Spring Boot 整合小程序实现报修巡检费用全流程
spring boot·后端·小程序
考虑考虑11 小时前
@JsonInclude注解使用
spring boot·后端·spring
凤山老林16 小时前
Spring Boot 集成 Redis Stream 做可靠消息队列:持久化、消费组重组与流式处理实战
spring boot·redis·后端
.Hypocritical.17 小时前
SpringBoot+Vue 前后端分离项目部署到云服务器
服务器·vue.js·spring boot
云和数据.ChenGuang18 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整指南
java·人工智能·spring boot·后端·重构·springai
豆角焖肉18 小时前
SpringBoot 集成腾讯 AI 人脸识别
人工智能·spring boot·后端·人脸识别·腾讯 ai·base64 图片
十年Java程序媛19 小时前
Java String、StringBuilder、StringBuffer 底层原理|字符串拼接性能与线程安全
java·开发语言·spring boot·安全·面试
她的男孩19 小时前
升级 Spring Boot 4 后流程起不来、登录却报缺租户:Forge Admin 补上 applicationTaskExecutor 与旧 Sa-Tok
spring boot·安全·工作流引擎