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

【SpringBoot】SpringBoot解决循环依赖😊

在SpringBoot开发中,循环依赖(CircularDependency)是一个常见但又令人头疼的问题🤯。当两个或多个Bean相互依赖时,就会形成循环依赖。本文将介绍SpringBoot如何处理循环依赖问题。

什么是循环依赖?🔄

循环依赖是指两个或多个Bean相互依赖,形成一个闭环。例如:

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

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

Spring如何解决循环依赖?🛠️

Spring通过三级缓存机制解决了大部分循环依赖问题:

1.一级缓存:存放完全初始化好的Bean
2.二级缓存:存放原始Bean(尚未填充属性)
3.三级缓存:存放Bean工厂,用于生成原始Bean

```java
//Spring内部处理循环依赖的核心逻辑
Objectbean=getSingleton(beanName);
if(bean==null){
//1.创建原始对象并放入三级缓存
addSingletonFactory(beanName,()->getEarlyBeanReference(beanName,bean));

//2.填充属性(可能触发依赖Bean的创建)
populateBean(beanName,bean);

//3.初始化完成后放入一级缓存
addSingleton(beanName,bean);
}
```

如何避免循环依赖?🚫

虽然Spring能处理部分循环依赖,但最好从设计上避免:

1.重构设计:使用接口或抽象类解耦
2.Setter注入代替构造器注入
3.@Lazy注解延迟初始化

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

总结🎯

SpringBoot通过三级缓存机制优雅地解决了大部分循环依赖问题💪。但作为开发者,我们仍应关注代码设计,从根本上避免循环依赖的产生。当遇到循环依赖时,可以使用@Lazy等注解临时解决,但长期来看,重构设计才是最佳实践✨。

记住:良好的设计>框架的容错能力!😉

相关推荐
hahjee2 分钟前
Go编写的ANSI终端颜色和样式控制库在OpenHarmony PC上的完整适配实战
开发语言·后端·鸿蒙
野蛮人6号9 分钟前
黑马微服务p10mybatisplus09核心功能iservice 测试文档无法正常打开
java·黑马微服务
危险、10 分钟前
《Java Stream 中 toMap 的生产级用法:一次 Duplicate key 的异常问题复盘》
java
古城小栈15 分钟前
Java 内存优化:JDK 22 ZGC 垃圾收集器调优
java·python·算法
福大大架构师每日一题18 分钟前
rust 1.92.0 更新详解:语言特性增强、编译器优化与全新稳定API
java·javascript·rust
小火锅啊22 分钟前
java实现生成PDF文件
后端
xiaogc_a22 分钟前
【无标题】
java
源码技术栈28 分钟前
智慧工地微服务架构+Java+Spring Cloud +Uni-App +MySql开发,在微信公众号、小程序、H5、移动端
java·ai·saas·智慧工地·智慧工地项目·可视化大屏·智慧工地系统
老华带你飞32 分钟前
健身房预约|基于springboot 健身房预约小程序系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·小程序
paopaokaka_luck32 分钟前
基于SpringBoot+Uniapp的自习室预约小程序(腾讯地图API、Echarts图形化分析、二维码识别)
vue.js·spring boot·后端·spring·echarts