spring循环依赖详细总结:
当前a,b两个bean相互依赖的时候就是循环依赖,spring处理循环依赖流程:
rerefsh -->finishBeanFactoryInitialization–>genBean–doGetBean–>createBean–>doCreateBean–>getSingleton–>createInstance–>addSingletonFactoics–>populateBean–>initiation
a对象创建的时候会先掉getBean(a)进行对象创建,调用createInstance创建对象,并把对象添加到三级缓存,这个时候添加的一个lamada表达式(key:a,value:lamaba),在对a对象里面的b属性进行赋值,赋值的时候先获取b属性,发现获取的b属性是一个RunTimeRefence对象,需要把这个对象转为beanDiefition对象,这个时候需要再次调用getBean(b)方法,传入b属性,由于b属性是一个对象,也需要创建bd对象,同流程一样,也需要把a对象添加对三级缓存,这个时候添加的一个lamada表达式(key:b,value:lamaba),这个需要给b对象里的a属性赋值,同样需要掉getBean(b)进行对象处理,这个时候就是奇迹发生的时候,应该创建前都会先查1,2,3级缓存,这个时候a,b(半成品)对象都存入了三级缓存,就是所谓的提前暴露。这个a从三级缓存中获取a的半成品对象,存入二级,同时删除三级缓存中的a,这个时候a返回,b对象就拿到了a返回的对象,完成自身实例化,然后b(成品对象)对象存入一级缓存,同时从三级缓存中删除,这个时候b对象完成同时就返回,这个时候a对象就拿到了b对象返回的对象,完成自身实例化,然后a(成品)对象存入一级缓存,同时从二级缓存中删除。这个时候循环还没有结束,因为我们只是获取了a对象进行操作的,因为list中有2个对象,还有一个b这个时候开始遍历b,因为在a对象创建完成的时候b对象提前创建好了,这个b对象直接从一级缓存中获取返回即可。
spring循环依赖详细总结
最新推荐文章于 2024-08-05 23:09:45 发布