• 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了。

  • 相关阅读:
    PTA L2-023 图着色问题-前向星建图 团体程序设计天梯赛-练习集
    PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集
    PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集
    HDU1166敌兵布阵(线段树单点更新)
    洛谷P1019——单词接龙(DFS暴力搜索)
    洛谷P1309——迷宫(傻瓜DFS)
    CodeForce-791B Bear and Friendship Condition(并查集)
    傻子都能懂的并查集题解——HDU1232畅通工程
    洛谷P1309——瑞士轮(归并排序)
    洛谷P1583——魔法照片(结构体排序)
  • 原文地址:https://www.cnblogs.com/merciless/p/14766171.html
Copyright © 2020-2023  润新知