什么是循环依赖
循环依赖就是两个对象之间存在相互依赖的关系;
Spring是如何解决循环依赖的
Spring使用三级缓存来解决循环依赖
三级缓存如何解决循环依赖的
三级缓存是通过三个HashMap来实现的。
- 一级缓存,用于保存已完成初始化的Bean实例,对外暴露可用的实例;
- 二级缓存,保存尚未完成初始化的Bean实例,为了处理循环依赖的对象创建问题;
- 三级缓存,保存创建Bean实例的工厂类,处理存在 AOP + 循环依赖的对象创建问题,能将代理对象提前创建。
三级缓存解决循环依赖过程
Spring 为什么要引入第三级缓存?
Spring 的设计原则是尽可能保证普通对象创建完成之后,再生成其 AOP 代理(尽可能延迟代理对象的生成)所以 Spring 用了第三级缓存,既维持了设计原则,又处理了循环依赖。
只用二级缓存能不能解决循环依赖?
可以,但是在AOP对象发生循环依赖的时候会存在一些问题。
一级和二级缓存
如果只用一级缓存和二级缓存时,在给Bean实例注入依赖时只能注入原始对象,而非提前创建的代理对象。因为属性赋值阶段完成之后,在Bean初始化阶段才会生成代理对象。
一级和三级缓存
如果只用一级缓存和三级缓存时,在每次获取依赖Bean实例的时候,都会通过ObjectFactory创建新的实例,违背Spring设计原则。