什么是循环依赖

循环依赖是指在对象之间存在相互依赖的关系,形成一个环路。简单来说,在对象 A 中依赖了对象 B,而对象 B 又依赖了对象 A,这样就形成了循环依赖。

Spring 循环依赖的处理策略

Spring 通过三级缓存的方式解决循环依赖的问题,分别是 singletonFactories、earlySingletonObjects 和 singletonObjects 三个缓存。

Spring 源码解析循环依赖的过程

下面将通过 Spring 的源码来解析循环依赖的过程:

  1. 首先,当一个 bean 被创建时,Spring 会将其放入 singletonFactories 缓存中,此时只是完成了对象的实例化,还未完成依赖注入。
  2. 接着,Spring 会递归创建该 bean 的依赖关系,也就是依赖该 bean 的其他 bean。对于每个依赖,Spring 会通过先创建对象的方式将其添加到 singletonFactories 缓存中。
  3. 然后,Spring 会尝试从 singletonObject 缓存中获取该 bean 的依赖对象。如果能够拿到,说明该依赖已经创建好了,可以直接注入。否则,Spring 会继续递归创建该依赖对象。
  4. 如果发现循环依赖,Spring 会抛出 BeanCurrentlyInCreationException 异常,防止无限循环。
  5. 当递归创建完所有依赖对象后,Spring 会将该 bean 添加到 singletonObjects 缓存中,并完成依赖注入。

通过以上过程,Spring 保证了循环依赖时依赖关系的正确处理,避免了无限递归的情况发生。