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

循环依赖问题概述

循环依赖指两个或多个Bean相互依赖,形成闭环。例如Bean A依赖Bean B,Bean B又依赖Bean A。Spring默认禁止循环依赖,但通过特定配置可解决部分场景。

解决方法

使用构造器注入+@Lazy注解 在构造器注入时配合@Lazy延迟加载可打破循环:

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

改为Setter/Field注入 Spring对Setter/Field注入的循环依赖有内置处理机制:

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

调整代码结构 通过提取公共逻辑到第三方类,或使用接口分离依赖关系,从根本上消除循环。

配置调整

application.properties中显式开启循环依赖支持:

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

注意事项

  • 构造器注入的循环依赖必须配合@Lazy
  • 循环依赖可能掩盖设计问题,应优先考虑重构
  • 原型(Prototype)作用域的Bean不支持循环依赖

最佳实践

推荐使用@Lazy结合Setter注入作为临时解决方案,同时通过以下方式优化设计:

  1. 应用依赖倒置原则(DIP)
  2. 引入事件驱动机制解耦
  3. 使用中间服务协调交互
相关推荐
蝎子莱莱爱打怪24 分钟前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
躺平大鹅37 分钟前
Java面向对象入门(类与对象,新手秒懂)
java
哈密瓜的眉毛美41 分钟前
零基础学Java|第三篇:DOS 命令、转义字符、注释与代码规范
后端
用户60572374873081 小时前
AI 编码助手的规范驱动开发 - OpenSpec 初探
前端·后端·程序员
哈密瓜的眉毛美1 小时前
零基础学Java|第二篇:Java 核心机制与第一个程序:从 JVM 到 Hello World
后端
用户8307196840821 小时前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者1 小时前
RocketMQ 集群介绍
后端·消息队列·rocketmq
初次攀爬者1 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
Leo8992 小时前
go 从零单排 之 一小时通关
后端
花花无缺2 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端