栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

简单明了的道破:为什么Spring解决循环依赖是使用三级缓存而不是两级缓存

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简单明了的道破:为什么Spring解决循环依赖是使用三级缓存而不是两级缓存

天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。

学习本知识之前先简单的脑补一下Spring bean的生命周期(大家不要过于纠结,感兴趣的可以去翻Spring的源码,我这里为了简单易懂,只是简单介绍大致流程以方便大家理解,贴源码的话大家不容易明白,还容易失去兴趣):
**第一步:**是创建Bean 实例(创建实例就是创建一个Bean的对象,注意这里并没有对Bean实例进行属性的填充)
**第二步 :**填充bean的成员属性,就是对使用到了注入属性的注解就会进行注入,如果在注入的过程发现注入的对象还没生成,则会跑去生产要注入的对象
**第三步:**初始化Bean 主要的操作是 执行一些初始化bean之前的方法 ,一些bean 中的init-method,以及初始化bean之后的方法等这些操作
**第四步:**如果这些Bean需要通过AOP进行代理的话就为这些bean在创建代理对象(重点:这里大家要明白,如果进行依赖注入的时候需要的是一个bean的代理对象,那是一定要注入这个代理对象的,否则一些通过代理实现的功能就失效了,比如像Spring的事务)

上述过程大家了解之后,来看为什么Spring解决循环依赖需要三级缓存而不是两级缓存:
spring利用singletonObjects, earlySingletonObjects, singletonFactories三级缓存去解决的,所说的缓存其实也就是三个Map

看上边的图结合上边Bean的生命周期的步骤:

注意spring bean的生命周期中如果一个bean需要被代理,是在最后一步完成bean的AOP代理的,也就是说在AOP代理之前是要完成bean的依赖注入的,假设一个bean不需要被aop代理,那么请看图中二级缓存和三级缓存的说明,这个时候只需要一级缓存存储完全实例化的bean,二级缓存存储提前曝光未完成依赖注入的Bean就可以了,这么看来好像只需要 两级缓存就可以解决循环依赖问题了,其实如果不需要AOP进行代理确实是只需要两级缓存就可以解决问题,但是如果bean需要被AOP代理,那么发生循环依赖需要提前曝光这个bean的时候必须要是被代理过的bean,但是这个被代理的bean只能在bean的生命周期的最后阶段才会被代理,这时候就需要通过额外的第三级缓存来获取提前获取这个被代理的Bean对象然后放入二级缓存中来解决这个问题,所以还要借助另外一个缓存,也就是第三级缓存来保存产生的代理对象。

通过简单的语言对过程进行描述,省去对繁杂代码的揣摩,简单易懂的阐明道理,是不是可以加快你学习的步伐

好了各位看官是不是已经清楚了呢?不清楚了请留言哦 _

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995270.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号