zoukankan      html  css  js  c++  java
  • spring循环依赖

    @Component
    classA{
    @Autowire
    private ClassB classB;
    }

    @Component
    classB{
    @Autowire
    private ClassA classA;
    }
    

    代码执行流程

    首先进入org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean方法的
    564行instanceWrapper = createBeanInstance(beanName, mbd, args);
    你也可以认为是 ClassA classA = new ClassA();
    
    同时把这个加入了Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);	
    也就是595行:addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));//三级缓存 ,思考一下为啥加入到三级缓存,加入到二级缓存行不行?
    
    
    接下来要给classA的属性赋值;
    也就是org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean方法的601行:
    populateBean(beanName, mbd, instanceWrapper);
    
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean方法里面的		
    1413行 :PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
    
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessProperties方法里面的
    399行:metadata.inject(bean, beanName, pvs);
    
    org.springframework.beans.factory.annotation.InjectionMetadata#inject方法里面的
    119行:	element.inject(target, beanName, pvs);
    
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#inject方法里面的
    640行:value = resolveFieldValue(field, bean, beanName);
    
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#resolveFieldValue方法里面的
    657行:value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter);
    
    org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency方法里面的
    1380行:instanceCandidate = descriptor.resolveCandidate(autowiredBeanName, type, this);
    
    org.springframework.beans.factory.config.DependencyDescriptor#resolveCandidate方法里面的
    276行:return beanFactory.getBean(beanName);就继续回到了doGetBean的
    256行的Object sharedInstance = getSingleton(beanName); 里面会从单例工厂里面获取objectBean 并且把它提前暴露出来,并且把它加载到二级缓存里面,同时清空三级工厂里面的
    

    org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean方法的
    335行return createBean(beanName, mbd, args);
    接下来就是回到了org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean方法进行ClassB的创建与赋值。
    其实两级缓存就能解决循环依赖的问题了一个用来保存完整的单例bean,也就是拿出来就可以用的bean。另一个用来保存只实例化的bean,但是没有进行赋值的不完整的bean,后续通过setter直接赋值,但是
    无法解决aop代理了之后的bean,如果没有三级缓存我们拿到的就是代理之前的bean,所以三级缓存里面放的ObjectFactory工厂,通过工厂再去获取bean,这样拿到的就是代理之后的bean了。

  • 相关阅读:
    JsBridge踩坑之WebViewJavascriptBridge is undefined,找不到Bridge对象
    Android踩坑之couldn't find "libClingSDK.so"
    GDM, KDM, LightDM, SDDM的区别和安装配置
    安装完ubuntu需要做得事
    apt vs snap
    在shell下执行命令的方法
    Vimmer一套全语言支持的完美Vim配置——附Monaco字体
    Ubuntu gnome安装Monaco字体,FontForge module is probably not installed
    Ubuntu全方位美化,定制教程
    stm32--FatFs调试过程(SPIFlash)
  • 原文地址:https://www.cnblogs.com/merciless/p/14766171.html
Copyright © 2011-2022 走看看