Spring 中解决循环依赖流程图
2023-02-07 15:34:27 3 举报
Spring解决循环依赖流程
作者其他创作
大纲/内容
true
判断一个bean是否正在创建,实际是判断singletonsCurrentlyInCreation集合中是否有这个bean的名字,后面bean在创建时会将beanName放入集合中this.singletonsCurrentlyInCreation.contains(beanName);
beforeSingletonCreation(beanName);
返回正在创建的Bean,如果是AOP需要在这里提前进行这里进行AOP时还需要放入一个earlyProxyReferences 的map,用来判断是否已经提前进行了循环依赖singletonObject = singletonFactory.getObject();
从三级缓存中获取ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
@Componentpublic class StudentA { @Autowired private StudentB studentB;}
spring解决循环依赖使用到了三级缓存、一个set集合用来标注bean是否存在循环依赖、一个earlyProxyReferences 的Map在提前进行AOP时用来标注当前bean是否已经提前进行了AOP。在代码中分如下所示:一级缓存:singletonObjects,也是单例池,单例Bean完全创建成功后放入二级缓存:earlySingletonObjects,放入的是正在创建的半成品bean,它还没有完全经历Bean的创建生命周期三级缓存:singletonFactories,存在循环依赖属性赋值前放入,存的是一个lambda表达时,在从三级缓存中获取对象是调用标注是否存在循环依赖集合:singletonsCurrentlyInCreation,创建bean时 放入beanName,Bean正在创建判断bean是否已提前进行了AOP:earlyProxyReferences,提前进行AOP时放入,后面进行初始化步骤操作时,如果提交进行了AOP将不会再次进行
false
创建studentAgetBean(\"studentA\")
放入beanName,表示bean正在创建this.singletonsCurrentlyInCreation.add(beanName)
getBean(beanName)
true:参数默认支持循环依赖getSingleton(“beanNamefont color=\"#323232\
@Componentpublic class StudentB { @Autowired private StudentA studentA;}
如下所示:StudentA 依赖了StudentB,StudentB依赖了StudentA这就是Spring中的循环依赖。以Spring创建StudentA为例说明Spring解决循环依赖的流程
存在循环依赖时添加到三级缓存if(isSingletonCurrentlyInCreation(beanName)
返回为null,且判断当前bean是否正在创建singletonObject == null && isSingletonCurrentlyInCreation(beanName)
singletonObject == null && allowEarlyReference
可以从二级缓存中获取,直接返回对象,二级缓存中的对象
存在循环依赖从二级缓存中获取singletonObject = this.earlySingletonObjects.get(beanName);
0 条评论
回复 删除
下一页