Java开发-面试题-0024-什么是 Spring 的循环依赖,Spring是怎么解决的,三级缓存的作用有哪些
文章目录
更多内容欢迎关注我(持续更新中,欢迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
技术公众号:CodeZeng1998(纯纯技术文)
生活公众号:好锅(Life is more than code)
其他平台:CodeZeng1998、好锅
1.什么是 Spring 的循环依赖
@Component
public class A {
@Autowired
private B b;
}
@Component
public class B {
@Autowired
private A a;
}
循环依赖:
- 在创建A对象的同时需要使用的B对象,在创建B对象的同时需要使用到A对象
- A需要B,B需要C,C需要A
- A需要A
在Spring中,Bean的创建过程主要分为三个步骤:
- 实例化(Instantiation):创建Bean的实例。
- 依赖注入(Dependency Injection):为Bean的属性注入依赖。
- 初始化(Initialization):调用
@PostConstruct
等初始化方法。
如果没有三级缓存,Spring容器在实例化A
时,会发现A
依赖B
,于是先去实例化B
。但在实例化B
的过程中,又会发现B
依赖A
,于是再次去实例化A
,这时就会进入一个死循环。
2.Spring是怎么解决的循环依赖的
三级缓存解决循环依赖:
Spring 解决循环依赖是通过三级缓存,对应的三级缓存如下所示:
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
// 一级缓存
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object