Spring初始化之循环依赖
InjectionMetadata.inject

resolveFieldValue解析去解析 对象的属性时

会自动去解析该属性是否是Bean依赖对象

DefaultListableBeanFactory.doResolveDependency会去调用DependencyDescriptor.resolveCandidate方法

而DependencyDescriptor.resolveCandidate方法就是回去调用BeanFactory.getBean方法

最终还是会调用AbstractBeanFactory.doGetBean方法,再回到AbstractAutowireCapableBeaFactory.doCreateBean,进行循环依赖注入。
循环依赖出现的问题
Spring通过三级缓存思想,对循环依赖出现的问题进行规避,到出现循环依赖问题时,提前中断初始化。

它的思想是,当某个Bean A在初始化时,放入到正创建Bean的缓存中,当Bean B在在初始化时,如果需要注入Bean A,而Bean B初始化时也需要注入Bean A,而Bean A必须依赖于Bean B初始化完成,导致Bean A无法初始化,BeanA 无法初始化就会导致BeanB也无法初始化,就会出现循环依赖问题,使项目无法启动

浙公网安备 33010602011771号