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

【SpringBoot】SpringBoot解决循环依赖🔄

在SpringBoot开发中,循环依赖(CircularDependency)是一个常见但令人头疼的问题😫。当两个或多个Bean相互依赖时,就会形成循环依赖。本文将介绍几种解决方案💡。

什么是循环依赖?🤔

```java
@Service
publicclassServiceA{
@Autowired
privateServiceBserviceB;
}

@Service
publicclassServiceB{
@Autowired
privateServiceAserviceA;
}
```

上面的代码中,ServiceA依赖ServiceB,而ServiceB又依赖ServiceA,形成了典型的循环依赖🔁。

解决方案

1.使用构造器注入🏗️

```java
@Service
publicclassServiceA{
privatefinalServiceBserviceB;

publicServiceA(ServiceBserviceB){
this.serviceB=serviceB;
}
}

@Service
publicclassServiceB{
privatefinalServiceAserviceA;

publicServiceB(ServiceAserviceA){
this.serviceA=serviceA;
}
}
```

Spring官方推荐使用构造器注入,它能更早发现循环依赖问题🚨。

2.使用@Lazy延迟加载⏳

```java
@Service
publicclassServiceA{
@Autowired
@Lazy
privateServiceBserviceB;
}
```

`@Lazy`注解可以延迟Bean的初始化,打破循环依赖链🔗。

3.使用Setter/方法注入🛠️

```java
@Service
publicclassServiceA{
privateServiceBserviceB;

@Autowired
publicvoidsetServiceB(ServiceBserviceB){
this.serviceB=serviceB;
}
}
```

Setter注入比字段注入更灵活,能解决部分循环依赖问题✨。

4.重构设计🧩

最佳实践是重新设计代码结构,避免循环依赖:

-提取公共逻辑到第三个类中
-使用接口隔离
-应用依赖倒置原则

总结🎯

SpringBoot默认支持单例作用域下的Setter/字段注入方式的循环依赖,但不推荐依赖这种机制🚧。优先考虑构造器注入和代码重构,这才是更健壮的解决方案💪。

记住:良好的设计比解决循环依赖更重要!🌟

相关推荐
腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影5 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121316 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔6 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
码事漫谈6 小时前
告别数据孤岛与AI“水土不服”:金仓多模融合时序库如何让数据真正服务于业务
后端
IT_陈寒6 小时前
Redis的持久化配置把我坑惨了:你以为数据安全了?
前端·人工智能·后端
星栈6 小时前
Node 接口该写同步还是异步?
后端·node.js
红烧大青虫7 小时前
HarmonyOS应用开发实战:小事记 - UIAbility 的冷启动/热启动/后台启动三种场景与 launchParam 解析
后端·华为·harmonyos·鸿蒙系统
码事漫谈7 小时前
AI Token 缓存:命中省 10 倍,不命中白扔钱
后端
CRMEB系统商城7 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源