spring循环依赖

2020-03-07  本文已影响0人  卫渐行

Spring 循环依赖

什么是循环依赖

概念: 在代码中对象A依赖对象B,对象B依赖对象A,对象相互之间依赖关系;

Class A{
 private B b;
}
Class B{
private A a;
}

Spring能解决什么情况下的依赖

Class A {
B b ;
private setB(B b){
this.b=b;
}
}

Spring不能解决循环依赖的情况

Spring如何解决的单例的循环依赖问题

三个缓存对象

1:在DefaultSingletonBeanRegistry 单例的注册中心有三个缓存的对象:
2 源码分析
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
   //一级缓存
   Object singletonObject = this.singletonObjects.get(beanName);
   if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
      synchronized (this.singletonObjects) {

         singletonObject = this.earlySingletonObjects.get(beanName);//首先判断二级缓存是否存在
         if (singletonObject == null && allowEarlyReference) {
            ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);//判断三级缓存中是否存在bean对象
            if (singletonFactory != null) {
               singletonObject = singletonFactory.getObject();//从三级缓存中取出数据的时候,需要将bean对象转换成器代理对象,
               this.earlySingletonObjects.put(beanName, singletonObject);//如果三级缓存中存在,吧bean 对象加入到二级缓存中
               this.singletonFactories.remove(beanName);//移除三级缓存中的数据
            }
         }
      }
   }
   return singletonObject;
}

通过上述代码,非常清晰的告诉读者;在单例的对象创建之前,都会先从一级缓存的singletonObjects获取对象;

如果一级缓存中没有,从earlySingletonObjects 提前曝光的二级缓存中获取对象;

总结:根据上述的源代码,getSingleton和addSingletonFactory ,知道了三个缓存中的转换关系;如果A依赖B,B依赖A

Spring调用栈的时序图

分析spring 解决循环依赖问题,需要主要上面的几个流程,同时把握Spring 源码在初始化Spring bean对象的过程;

下面是具体的时序图;有待完善,只记录自己的学习过程


时序图.png
上一篇 下一篇

猜你喜欢

热点阅读