spring三级缓存的工作原理都见过很多了,但是为什么要这么做,这么做为什么就能解决循环依赖问题,还是很少有人能说清楚,笔者今天学习过后分享一点个人的想法。
一、bean创建过程中的中间状态可被引用
想象一下,如果一个bean只有彻底完成创建,才能被另一个bean注入和使用。那么对于A注入B,B注入A的循环依赖场景,是完全没有办法解决的。只有将一个未完成所有创建动作的bean作为被注入对象使用,才有可能跳出循环。
二、有一个bean先跳出循环
中间状态可被引用的前提下,初始化A时注入B,发现无法找到B,然后初始化B,此时B要注入A,则此时直接使用A的中间状态作为引用注入即可,然后B就可以完成创建。此时需要特别注意,这一步,B率先完成了初始化,这便实现了跳出依赖循环的效果。后续,顺利成章地,A此时便能注入B完成自己的创建。
所谓三级循环,只是基于这种思想的实现机制,不必死记硬背回。过头去看,三级缓存用来存放工厂方法,方便当你需要时获取其中间状态单例,二级缓存用来存放中间状态的单例,一级缓存用来存放最终使用的单例池。这几个单例池都是实现上述思想和过程的工具而已,基于这种思想,可以解决许多相似问题。

400

被折叠的 条评论
为什么被折叠?



