【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注解适用于临时解决方案,但可能掩盖设计问题。
  • 循环依赖可能导致难以维护的代码,建议通过模块化设计规避。
相关推荐
vipxieliang1 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
码兄科技1 天前
24小时自助健身房系统软件开发实战指南:功能设计与部署方案
java·spring boot·uni-app
paopaokaka_luck1 天前
智慧社区综合服务小程序(人脸识别、AI问答、Echarts图形化分析)
前端·javascript·spring boot·spring·数据分析·echarts
需要8261 天前
JVM 内存区域与对象创建:一次 GC 从哪来
java·jvm·spring boot·spring·servlet·tomcat
凤山老林1 天前
Spring Boot 应用 JVM 性能调优实战:GC 日志分析、堆内存规划与容器环境避坑
jvm·spring boot·gc·堆内存
计算机毕设定制辅导-无忧学长1 天前
《基于Vue的流浪动物救助中心管理系统的设计与实现》
java·vue.js·spring boot·流浪动物救助中心管理系统
huaweichenai1 天前
spring boot操作PDF
java·spring boot·pdf
2601_953824611 天前
基于SSM的水果超市管理系统
java·tomcat·maven