Spring 的循环依赖问题

Spring 只能解决单例模式的循环依赖问题,对于原型或者其他类型的无法解决,并且也是固定场景下的循环依赖。

个人感觉,循环依赖一定程度上反应了代码结构上的问题,应该从代码上就尽量避免。

原理简述

Spring 中使用了三级缓存 Map 分别保存以下三种对象:

  1. 完全初始化完毕的对象
  2. 创建但未初始化的对象
  3. Bean 的工厂对象,通过调用工厂方法可以获取到该 Bean 对象


第 1 级 Map 就是 BeanFactory 的核心,保存的是真实的 Bean,而 2,3 两级别是专门为了解决循环依赖而存在的。

Spring 中的 Bean 获取过程是按照缓存等级从上到下获取的。

例如,A,B 对象存在循环依赖。

  1. A 创建过程中判断需要依赖 B,所以 A 将自身放入 3 类缓存,并去实例化 B。
  2. B 实例化的时候从 3 级缓存中获取 A 的对象,并将 A 对象放入 2 级缓存
  3. B 初始化完毕之后进入 1 级缓存
  4. 继续创建 A 对象,从 1 级缓存中获取到 B 对象,并将自身移入 1 级缓存。

使用 ObjectFactory 是因为需要提前曝光但延迟创建代理。

results matching ""

    No results matching ""