Loading

Spring 循环依赖

什么是循环依赖?

循环依赖是两个或者两个以上的bean相互持有对方,最终形成闭环。比如A依赖B、B依赖C、C依赖A_​_
image.png
Spring目前支持Field属性和单例bean循环依赖,不支持构造器方式

  • propotype原型bean无法解决循环依赖

在创建前Spring也会判断bean的scope,如果是propotype则会抛出BeanCurrentlyInCreationException
异常
image.png

  • 单例bean循环依赖解决思路

image.png

  1. bean A开始创建,实例化完成后直接放入singletonFactories,同时加入扩展操作
  2. bean A属性设置过程中发现依赖bean B,便通过BeanFactory.getBean获取bean B,发现bean B不存在,开始创建bean B
  3. bean B实例化完成后,开始属性设置,发现依赖bean A直接从singletonFactories获取bean A,然后升级bean A到earlySingletonObjects,在升级过程中执行扩展操作
  4. bean B创建完成放入singletonObjects中,bean A继续设置属性
  5. bean A创建完成,放入singletonObjects,完成循环依赖过程

org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
image.png
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
image.png

posted @ 2021-12-18 15:47  Vic呼叫89  阅读(32)  评论(0)    收藏  举报