【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注解适用于临时解决方案,但可能掩盖设计问题。
  • 循环依赖可能导致难以维护的代码,建议通过模块化设计规避。
相关推荐
云创智城-yuncitys6 小时前
YunParking 4.0:JDK 17 与 Spring Boot 3.2 的停车云升级
java·开发语言·spring boot
paopaokaka_luck8 小时前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
学长毕设10 小时前
基于SpringBoot的网上流浪狗救助捐赠平台-附源码
java·spring boot·后端
码农的日常10 小时前
前后端Long精度丢失的踩坑
spring boot·架构
杨运交11 小时前
086-对象存储模块-基于Spring Boot的文件存储模块监控设计与实现
java·spring boot·后端
wifi___13 小时前
SpringBoot自动装配原理
java·spring boot·后端
Small-Young13 小时前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·spring boot·mysql·postgresql·乐观锁·并发控制
她的男孩14 小时前
租户 A 的验证码,却用了租户 B 的 AccessKey:Forge Admin 修跨租户短信串发
java·spring boot·saas
小蒜学长15 小时前
基于SpringBoot+Vue的云南地区扶贫助农系统的设计与实现(代码+数据库+LW)
java·vue.js·spring boot·后端·乡村振兴
RuoyiOffice15 小时前
Hyper-V+Kubernetes 搭建实战:保留 Windows,构建三节点 Linux 容器集群
linux·spring boot·kubernetes·containerd·hyper-v·微服务部署·ruoyi office