【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. 使用中间服务协调交互
相关推荐
文丑颜不良啊37 分钟前
LeetCode1941~1960题目解析
java·leetcode
txxzjmzlh1 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
nice_lcj5203 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河663 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
IT_陈寒4 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端
系统集成-鹰翔4 小时前
ERP图片改名后仍命中识别缓存:缓存键、十分钟到期与调用计数
javascript·经验分享·后端
用户8356290780514 小时前
使用 Python 在 Excel 中添加和自定义迷你图
后端·python
码事漫谈4 小时前
给AI看一颗❤️,它就开始写递归了
后端
用户8356290780514 小时前
使用 Python 在 Excel 图表中添加趋势线与回归方程
后端·python
你三大爷4 小时前
Netty / Kafka / Redis 保序问题的源码对比与 NIO 框架主流解法
后端·架构