spring中的三级缓存为何方神圣

343 阅读2分钟

这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战

我们现在开始觊觎spring容器化来实现循环依赖到底怎么玩?

   这里我们就利用xml文件来实现,application.xml,两个对象A和B,互相依赖

image.png

image.png

image.png

image.png

建议一下,set方式注入是没问题的,然后我们在基础上添加spring容器的配置文件,注意看好添加的位置; image.png

image.png 开始做spring容器实例化创建两个对象,进行循环依赖;

image.png

注意事项: 

   第一次开始的时候,可能会遇见bean不存在,注意建立时候配置文件的位置,检查A和B的位置,我准备了链接,给你谈谈路,

image.png 如何优雅的解决:

https://winterchen.blog.csdn.net/article/details/78425230?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

成功如下: image.png

思考一下,是因为spring容器化对象的时候,scope=singleton,单例对象,要是变为scope=phototype ,(原型)也就是每次调用,都会创建一个新的A对象或者是B对象, 好汉们:试一把:我们将配置文件的scope属性改了;

image.png

image.png

报出的错误,和我们之前构造器注入方式一致,都是BeanCurrentlyInCreationException:bean对象一致处于创建内层的循环中,发生异常,也就说当scope属性不是单例的时候,无法解决spring循环依赖的问题;

 

其实做到这里,我们只是知道了,spring循环依赖是利用单例spring容器化,或者是set方式注入,实现具体的循环依赖(circular dependencies ),但是我还是想知道,到底源码底层是如何实现的;相应的我查到了新名词,与spring循环依赖是有三级缓存实现的;

结论先记下:spring内部是根据三级缓存来实现循环依赖的

三级缓存

当面试官说道,spring循环依赖,你能提到三级缓存,那证明你绝对是拥有内功的,这属于源码范畴,也可以侧面了解到你的学习潜力,哈哈,开干:三级缓存主要是这个类; DefaultSingletonBeanRegistry;

   IDEA的同学呢,可以那两次shift键,查询这个类的具体实现过程;

     这个类中其实是利用三个MAP,来实现三级缓存的;

     何为三级缓存:

image.png 三级缓存只是适用于,对象是单例bean对象,每次创建bean对象;

  注意事项:

 在java中对于实例化和初始化是两个概念:

   实例化对象之后-->才能初始化对象属性

 实例化:  相当于自身需要请求一块区域,但是只是在申请成功的过程中,其中放什么还是未知的数据 初始化:我们常说初始化--代表程序加载属性,各种数据,开始运行的过程