怎么在春天中解决循环依赖问题

  介绍

怎么在春天中解决循环依赖问题?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

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, singletonObjects =, new  ConcurrentHashMap<祝辞(256);,//,一级缓存/* *,Cache  of  singleton 工厂:,bean  name 用ObjectFactory只*/字符串,private  final  Map, earlySingletonObjects =, new  ConcurrentHashMap<祝辞(16);,//,三级缓存

怎么在春天中解决循环依赖问题

对于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异常表示循环依赖。

使用

怎么在春天中解决循环依赖问题

Copyright © 2020-2023 feiqueyun.cn. All Rights Reserved. 肥雀云_南京肥雀信息技术有限公司版权所有 南京肥雀信息技术有限公司 苏ICP备16063723号-5