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

循环依赖的定义

循环依赖指两个或多个Bean相互依赖,形成闭环。例如Bean A依赖Bean B,而Bean B又依赖Bean A,导致Spring容器无法正常初始化。

使用构造函数注入避免循环依赖

Spring官方推荐优先使用构造函数注入而非字段注入。构造函数注入在启动时就能检测到循环依赖并抛出异常,避免运行时问题。

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

@Service
public class ServiceB {
    private final ServiceA serviceA;
    
    @Autowired
    public ServiceB(ServiceA serviceA) {
        this.serviceA = serviceA;
    }
}

此时启动会直接报错:Requested bean is currently in creation

使用@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;
}

@Service
public class ServiceB {
    @Autowired
    private ServiceA serviceA;
}

重新设计代码结构

最佳实践是通过中间层或接口解耦:

  1. 提取公共逻辑到第三方Bean
  2. 使用事件驱动(ApplicationEventPublisher
  3. 采用面向接口编程

调整Bean加载顺序

通过@DependsOn显式指定加载顺序:

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

注意事项

  • Spring默认允许单例Bean的循环依赖,但原型(Prototype)作用域的Bean会直接报错
  • 循环依赖可能暴露未完全初始化的Bean,导致NPE风险
  • 建议通过Sonar等工具检测循环依赖代码坏味道
相关推荐
一 乐1 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
Boilermaker19921 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维1 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
alonewolf_992 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子2 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
码事漫谈2 小时前
Protocol Buffers 编码原理深度解析
后端
sheji34162 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
码事漫谈2 小时前
gRPC源码剖析:高性能RPC的实现原理与工程实践
后端
恋爱绝缘体13 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wszy18093 小时前
新文章标签:让用户一眼发现最新内容
java·python·harmonyos