Spring循环依赖问题

什么是循环依赖

循环依赖就是两个对象之间存在相互依赖的关系;

Spring是如何解决循环依赖的

Spring使用三级缓存来解决循环依赖

三级缓存如何解决循环依赖的

三级缓存是通过三个HashMap来实现的。

  • 一级缓存,用于保存已完成初始化的Bean实例,对外暴露可用的实例;
  • 二级缓存,保存尚未完成初始化的Bean实例,为了处理循环依赖的对象创建问题;
  • 三级缓存,保存创建Bean实例的工厂类,处理存在 AOP + 循环依赖的对象创建问题,能将代理对象提前创建。

三级缓存解决循环依赖过程

循环依赖

Spring 为什么要引入第三级缓存?

Spring 的设计原则是尽可能保证普通对象创建完成之后,再生成其 AOP 代理(尽可能延迟代理对象的生成)所以 Spring 用了第三级缓存,既维持了设计原则,又处理了循环依赖。

只用二级缓存能不能解决循环依赖?

可以,但是在AOP对象发生循环依赖的时候会存在一些问题。
一级和二级缓存
如果只用一级缓存和二级缓存时,在给Bean实例注入依赖时只能注入原始对象,而非提前创建的代理对象。因为属性赋值阶段完成之后,在Bean初始化阶段才会生成代理对象。
一级和三级缓存
如果只用一级缓存和三级缓存时,在每次获取依赖Bean实例的时候,都会通过ObjectFactory创建新的实例,违背Spring设计原则。

你可能感兴趣的:(Spring循环依赖问题)