【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/字段注入方式的循环依赖,但不推荐依赖这种机制🚧。优先考虑构造器注入和代码重构,这才是更健壮的解决方案💪。

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

相关推荐
小圆5317 小时前
java-learn(9):常见算法,collection框架
java·开发语言·算法
nbsaas-boot8 小时前
SaaS 租户上下文传播架构
java·架构·saas
洛卡卡了8 小时前
一次上线事故,我干脆写了套灰度发布系统
后端·面试·架构
Java水解8 小时前
【Spring Boot】Spring 魔法世界:Bean 作用域与生命周期的奇妙之旅
spring boot·后端
西岭千秋雪_8 小时前
Zookeeper监听机制
java·linux·服务器·spring·zookeeper
毕设源码-林学长8 小时前
计算机毕业设计java和Vue的安全教育科普平台设计与实现 安全知识普及与教育平台 安全教育信息化管理平台
java·开发语言·课程设计
ruleslol8 小时前
java-接口适配器模式 & jsk8 接口默认实现
java·适配器模式
JohnYan8 小时前
Bun技术评估 - 26 Abort
javascript·后端·bun
逛逛GitHub8 小时前
国产首个开源 AI 原生后端平台,这次是真起飞了。
后端·github