1. 什么是循环依赖?
【【Spring】Bean 循环依赖】当一个 Bean A
依赖另外一个 Bean B
,Bean B
又依赖 Bean A
时,即发生了循环依赖。如图所示:
文章图片
或者中间隐含了多个 Bean,但是最终都形成了一个闭环:
文章图片
循环依赖示例
@Configuration
public class BeanCircularDependencies {@Component
static class A {@Resource
private B b;
public A(B b) {
this.b = b;
}
}@Component
static class B {@Resource
private C c;
public B(C c) {
this.c = c;
}
}@Component
static class C {@Resource
private A a;
public C(A a) {
this.a = a;
}
}
}
Spring 在启动时,会提示有循环依赖存在,并启动失败。
文章图片
2. 循环依赖的解决方法
(1)重新设计 出现循环依赖很可能是在业务设计方面存在一些问题,所以这个时候可以先考虑是否要重新合理划分类的指责。
(2)懒加载 Spring 提供了 @Lazy 注解,来延迟加载一个 bean。这种情况下,被修饰的 bean 只在第一次需要的时候才会完全被创建。所以在循环依赖中,只需要将其中闭环中的一个 bean 延迟加载,也可以解决这个问题。
@Component
static class A {@Resource
private B b;
public A(@Lazy B b) {
this.b = b;
}
}
(3)使用 Setter 属性注入 这是 Spring 建议使用这种方式来解决循环依赖
@Component
static class A {@Resource
private B b;
public void setB(B b) {
this.b = b;
}
}
其它的解决方式,例如:使用
@PostConstruct
或者 ApplicationContextAware
,可以参考 Circular Dependencies in Spring推荐阅读
- 大厂面试题精华总结|SpringCloud面试百题集
- 大厂面试题精华总结|SpringBoot面试百题集
- 大厂面试题精华总结|Spring面试百题集
- 毕业设计|SpringBoot+Vue项目旅游信息推荐系统【源码开源】
- 微服务|SpringCloud Alibaba微服务实战四 - 限流熔断
- spring|23.Spring Cloud + Spring Boot + Mybatis + Uniapp分布式、微服务、云架构企业快速开发架构之Shell 函数
- spring|Spring Cloud 微服务实践系列(三)—— Nacos注册中心
- Spring-AOP
- spring|nacos 概述