【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. 使用中间服务协调交互
相关推荐
杨杨杨大侠6 小时前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
凤山老林7 小时前
Spring Boot 启动冲刺:耗时剖析、懒加载策略与事件驱动初始化优化
spring boot·后端·python
Thinker QAQ7 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
朱涛的自习室7 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
霸道流氓气质9 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python
AOI小白新手上路9 小时前
autodl常用的tar 打包下载(数据集)命令手册:逐段拆解与套用模板
java·大数据·数据库
woniu_maggie10 小时前
SAP MDG主数据治理实战:从架构原理到项目实施全解析
后端
xiaoqiMikko10 小时前
Redis 实战(一):内存满了 —— 拒写、淘汰、被系统杀掉,以及删了 key 内存为什么不降(6.2.4 实测)
redis·后端
dishugj10 小时前
系统架构风险点、敏感点和权衡点的概念和区分
java·开发语言