【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. 使用中间服务协调交互
相关推荐
泡泡以安8 小时前
【Android逆向工程】第3章:Java 字节码与 Smali 语法基础
android·java·安卓逆向
毕设源码-朱学姐13 小时前
【开题答辩全过程】以 工厂能耗分析平台的设计与实现为例,包含答辩的问题和答案
java·vue.js
码事漫谈14 小时前
C++ 多线程开发:从零开始的完整指南
后端
9ilk14 小时前
【C++】--- 特殊类设计
开发语言·c++·后端
码事漫谈14 小时前
十字路口的抉择:B端与C端C++开发者的职业路径全解析
后端
Spring AI学习15 小时前
Spring AI深度解析(9/50):可观测性与监控体系实战
java·人工智能·spring
提笔了无痕15 小时前
git基本了解、常用基本命令与使用
git·后端
unique_perfect15 小时前
vue2与springboot实现deepseek打印机聊天
spring boot·websocket·ai·vue2·deepseek
java1234_小锋16 小时前
Spring IoC的实现机制是什么?
java·后端·spring
喵个咪16 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:JWT 集成指南
后端·go