首页 > 编程语言 > 详细

spring解决循环依赖,spring启动流程图分享

时间:2020-12-20 20:30:29      阅读:28      评论:0      收藏:0      [点我收藏+]

1.spring解决循环依赖

以例子Husband Wife为例,一个丈夫只有一位妻子,一位妻子只有一位丈夫,两个对象相互引用(Husband 类有属性Wife,Wife类有属性Husband,两个类都有setter方法)

画了个图

技术分享图片

这个流程看着还是比较麻烦的,实际清除明白bean的创建流程就很容易,从图中可以看出,关键是在DefaultSingletonBeanRegistry.singletonFactories这个缓存和DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, true)、DefaultSingletonBeanRegistry.addSingletonFactory(String, ObjectFactory<?>)方法。

IOC有三个主要map缓存

\1. DefaultSingletonBeanRegistry.singletonObjects 缓存最终的bean,即IOC的单例对象的容器

\2. DefaultSingletonBeanRegistry.singletonFactories 缓存 beanName与ObjectFactory对象,用于解决循环依赖,在DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String)方法内添加

\3. DefaultSingletonBeanRegistry.earlySingletonObjects 用于存储在创建Bean早期时候对创建的原始bean的一个引用,这里是原始bean(此时bean还没被注入属性),一旦bean最终创建好,此引用信息将删除。作用是为解决循环依赖而提早暴露出来的实例,用作补充singletonFactories,查找bean是该缓存没有再查找singletonFactories

spring IOC

解决循环依赖的大体步骤:

husband先实例化,并且将自己提前曝光到singletonFactories中,此时进行填充husband属性,发现自己依赖对象wife,此时就尝试去get(wife),发现wife还没有被create,所以走create流程,wife在初始化第一步的时候发现自己依赖了对象husband,于是尝试get(husband),尝试缓存singletonObjects(肯定没有,因为husband还没初始化完全),接着尝试缓存earlySingletonObjects(也没有),尝试缓存singletonFactories,由于husband通过ObjectFactory将自己提前曝光了,所以wife能够通过ObjectFactory.getObject拿到husband对象(虽然husband还没有初始化完全),wife拿到husband对象后顺利完成了初始化阶段(填充wife对象属性husband),完全初始化之后将自己缓存到singletonObjects中。此时返回husband中,husband此时能拿到wife的对象顺利完成自己的属性填充,最终husband也完成了初始化,缓存到singletonObjects中,而且此时,由于wife拿到了husband的对象引用,所以wife现在hold住的husband对象完成了初始化(对象是引用传递)。

2.spring IOC启动流程

本来总结了更加详细的图,但是可能只有我自己能看清楚了,就放个简化的图

技术分享图片

更加简化的bean创建图

技术分享图片

spring解决循环依赖,spring启动流程图分享

原文:https://www.cnblogs.com/zhangyjblogs/p/14163518.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!