spring getBean 循环依赖
2021-04-24 17:37:08 3 举报
spring bean的注入过程及如何解决循环依赖大大致流程
作者其他创作
大纲/内容
解析资源并注册beanDefinition及其他一系列操作
Object singletonObject = this.singletonObjects.get(beanName)
创建bean的核心方法
DefaultSingletonBeanRegistry
进入
否则
这个A应该是没有初始化属性的
开始获取Bbean = this.beanFactory.getBean(B);
完成A的注册到3级缓存中
getBean(beanName)
完成对A引用的解析
BeanDefinitionValueResolver
dependentBeans.add(B)dependenciesForBean.add(A)
拿到sharedInstance
判断是否为需要factoryBean,getObjectForBeanInstance
if(singletonObject == null && allowEarlyReference)==false
适配bean类型adaptBeanInstance
返回singletonObject
实例化初始化bean并注册到beanFactory中finishBeanFactoryInitialization(beanFactory)
初始化A的属性完成
A-BB->AgetBean(\"A\")
Object exposedObject = bean;
完成beanFactory.preInstantiateSingletons()
singletonObjects是最终bean的归属地,现在肯定是null
解析B的属性开始获取Bbean = this.beanFactory.getBean(A);
null
B的PostProcessorBeforeInit方法和bean的init方法
拿到singletonObject
refresh()
初始化bean的属性populateBean
完refresh()
返回resolveValue
完成singletoFactory.getobject()
添加完后返回
AbstractAutowireCapableBeanFactory
匹配类型adaptBeanInstance完成AdoCreateBean
DefaultListableBeanFactory
ObjectFactory
对B的属性A进行赋值bw.setPropertyValues(new MutablePropertyValues(deepCopy));
拿到A的exposedObject返回
singletonObject = singletonFactory.getObject();
AbstractApplicationContext
检测是否从FactoryBean获取beanbeanInstance = getObjectForBeanInstance
Object sharedInstance = getSingleton(beanName)
完成BdoGetBean
完成applyPropertyValues
这里又开始在缓存中找beanObject sharedInstance = getSingleton(beanName)
2级中没得singletonObject = this.earlySingletonObjects.get(beanName);
完成A属性的赋值操作
对value进行deepCopy
完成对B的解析,拿到B的实例
完成getBean
返回A
如果属性是bean引用则获取引用的bean
font color=\"#330000\
beforeSingletonCreation(beanName)beanName加入singletonsCurrentlyInCreation
if (exposedObject == bean)如果没有增强,这里相等返回exposedObject
实例化bean创建wrappedInstance
if (earlySingletonReference != null)==false
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);拿到signletonFactory
删除A的1级缓存singleFactorythis.singletonFactories.remove(beanName);
初始化beanFactory.preInstantiateSingletons()
lamda表达式是一个ObjectFactory匿名实现类
调用匿名ObjectFactory实现类的的getiObjec方法,该方法在llamda中是直接创建bean
添加一个匿名ObjectFactory实现类到singletonFatories缓存中,这是1级缓存,也是实现循环依赖的关键,这个bean是通过beanDefinition创建的bean并封装在beanInstanceWrapper中,属性还没有被初始化。当发生循环依赖的时候,这个bean才会被拿到并存到2级缓存earlySingletonObjects中
进入,一堆操作后会,对属性赋值
AbstractBeanFactory
FileSystemXmlApplicationContext
循环依赖抛异常
完成A的doCreateBean
0 条评论
下一页