码迷,mamicode.com
首页 > 编程语言 > 详细

spring循环依赖

时间:2021-05-24 08:23:12      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:data   desc   wrapper   hash   instance   流程   single   factor   bean   

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

spring循环依赖

标签:data   desc   wrapper   hash   instance   流程   single   factor   bean   

原文地址:https://www.cnblogs.com/merciless/p/14766171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!