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

循环依赖的概念

循环依赖是指两个或多个Bean相互依赖,形成闭环。例如Bean A依赖Bean B,Bean B又依赖Bean A。Spring默认情况下会抛出BeanCurrentlyInCreationException异常。

解决方法

使用构造器注入 + @Lazy注解

在构造器注入的场景下,可以通过@Lazy延迟加载其中一个Bean来打破循环:

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;
}

调整代码结构

最彻底的解决方案是重构代码,提取公共逻辑到第三个Bean中,或使用接口分离依赖关系。

Spring处理循环依赖的机制

Spring通过三级缓存解决Setter/Field注入的循环依赖:

  • 一级缓存:存放完整初始化的Bean
  • 二级缓存:存放早期暴露的原始Bean
  • 三级缓存:存放Bean工厂,用于生成原始Bean

注意事项

  • 构造器注入的循环依赖必须显式解决
  • 循环依赖可能掩盖设计问题,应优先考虑重构
  • 高版本Spring Boot默认禁止循环依赖,可通过配置允许:
properties 复制代码
spring.main.allow-circular-references=true

推荐做法

对于必须存在的循环依赖,建议:

  1. 使用@Lazy注解
  2. 保持最少量的循环关系
  3. 添加文档说明循环的必要性
  4. 监控循环依赖Bean的性能影响
相关推荐
choke233几秒前
[特殊字符] Python 文件与路径操作
java·前端·javascript
choke2336 分钟前
Python 基础语法精讲:数据类型、运算符与输入输出
java·linux·服务器
岁岁种桃花儿17 分钟前
CentOS7 彻底卸载所有JDK/JRE + 重新安装JDK8(实操完整版,解决kafka/jps报错)
java·开发语言·kafka
一灰灰blog36 分钟前
Spring AI中的多轮对话艺术:让大模型主动提问获取明确需求
数据库·人工智能·spring
roman_日积跬步-终至千里1 小时前
【Java并发】Java 线程池实战:警惕使用CompletableFuture.supplyAsync
java·开发语言·网络
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
CodeSheep程序羊1 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
Java水解2 小时前
【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析
后端·spring
我是咸鱼不闲呀2 小时前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
Java水解2 小时前
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端
spring boot·后端