怎么在春天中解决循环依赖问题?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
setter单循环依赖
使用
SingleSetterBeanA依赖SingleSetterBeanB, SingleSetterBeanB依赖SingleSetterBeanA。
@ data public class  SingleSetterBeanA { @ autowired private SingleSetterBeanB  singleSetterBeanB; }
@ data public class  SingleSetterBeanB { @ autowired private SingleSetterBeanA  singleSetterBeanA; }
源码分析
春天是通过三级缓存来解决循环依赖的,那么三级缓存是怎么工作的呢?
三级缓存对应org.springframework.beans.factory.support。DefaultSingletonBeanRegistry类的三个属性:
/* *, Cache of singleton 对象:,bean name 用bean 实例只*/字符串,private final  Map
对于setter注入造成的依赖是通过春容器提前暴露刚完成实例化但未完成初始化的bean来完成的,而且只能解决单例作用域的bean循环依赖。通过提前暴露一个单例工厂方法,从而使其他豆能引用到该bean,关键源码如下所示:
org.springframework.beans.factory.support。AbstractAutowireCapableBeanFactory # doCreateBean
//,处理循环依赖,实例化后放入三级缓存 boolean earlySingletonExposure =, (mbd.isSingleton (),,,, this.allowCircularReferences ,, isSingletonCurrentlyInCreation (beanName)); if (earlySingletonExposure), { if (logger.isTraceEnabled ()), { logger.trace (“Eagerly  caching bean & # 39;“, +, beanName + “& # 39;,用allow for resolving potential circular references"); } addSingletonFactory (beanName,, (),→, getEarlyBeanReference (beanName, mbd,, bean)); }
豆实例化后放入三级缓存中:
org.springframework.beans.factory.support。DefaultSingletonBeanRegistry # addSingletonFactory
protected void addSingletonFactory (String beanName, ObjectFactory<?祝辞,singletonFactory), { Assert.notNull (singletonFactory,“Singleton  factory must not be null"); synchronized (this.singletonObjects), { if (! this.singletonObjects.containsKey (beanName)), { this.singletonFactories.put (beanName, singletonFactory);,//,三级缓存 this.earlySingletonObjects.remove (beanName); this.registeredSingletons.add (beanName); } } }
放入三级缓存中的是ObjectFactory类型的λ表达式:
org.springframework.beans.factory.support。AbstractAutowireCapableBeanFactory # getEarlyBeanReference
protected Object getEarlyBeanReference (String beanName, RootBeanDefinition mbd,, Object bean), { Object exposedObject =,豆; if (! mbd.isSynthetic (),,,, hasInstantiationAwareBeanPostProcessors ()), { 时间:for (BeanPostProcessor bp getBeanPostProcessors ()), { if (bp instanceof SmartInstantiationAwareBeanPostProcessor), { SmartInstantiationAwareBeanPostProcessor ibp =, (SmartInstantiationAwareBeanPostProcessor),英国石油公司;/* * ,* @see org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator # getEarlyBeanReference (java . lang . object,,以) ,*///,使用AbstractAutoProxyCreator # getEarlyBeanReference创建代理对象 时间=exposedObject ibp.getEarlyBeanReference (exposedObject, beanName); } } } return exposedObject; }
构造器参数循环依赖
通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖。
使用