一、什么是Spring三级缓存


第一级缓存:也叫单例池,存放已经经历了完整生命周期的Bean对象。

第二级缓存:存放早期暴露出来的Bean对象,实例化以后,就把对象放到这个Map中。(Bean可能只经过实例化,属性还未填充)。

第三级缓存:存放早期暴露的Bean的工厂。

注:

只有单例的bean会通过三级缓存提前暴露来解决循环依赖的问题,而非单例的bean,每次从容器中获取都是一个新的对象,都会重新创建,所以非单例的bean是没有缓存的,不会将其放到三级缓存中。

为了解决第二级缓存中AOP生成新对象的问题,Spring就提前AOP,比如在加载b的流程中,如果发送了循环依赖,b依赖了a,就要对a执行AOP,提前获取增强以后的a对象,这样b对象依赖的a对象就是增强以后的a了。

二三级缓存就是为了解决循环依赖,且之所以是二三级缓存而不是二级缓存,主要是可以解决循环依赖对象需要提前被aop代理,以及如果没有循环依赖,早期的bean也不会真正暴露,不用提前执行代理过程,也不用重复执行代理过程。

二、对象在三级缓存中的创建流程

A依赖B,B依赖A

1、A创建过程中需要B,于是先将A放到三级缓存,去实例化B。

2、B实例化的过程中发现需要A,于是B先查一级缓存寻找A,如果没有,再查二级缓存,如果还没有,再查三级缓存,找到了A,然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A。

3、B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中的状态)。然后回来接着创建A,此时B已经创建结束,可以直接从一级缓存里面拿到B,去完成A的创建,并将A放到一级缓存。

什么是Spring三级缓存 对象在三级缓存中的创建流程 【三级缓存 循环依赖】相关推荐

  1. Spring 源码解析 - Bean创建过程 以及 解决循环依赖

    一.Spring Bean创建过程以及循环依赖 上篇文章对 Spring Bean资源的加载注册过程进行了源码梳理和解析,我们可以得到结论,资源文件中的 bean 定义信息,被组装成了 BeanDef ...

  2. Spring IoC 源码系列(四)bean创建流程与循环依赖问题分析

    创建单例 bean 的代码细节在 org.springframework.beans.factory.support.AbstractBeanFactory#getBean 中,getBean 顾名思 ...

  3. mysql 中修改对象_在MySQL中,创建一个数据库后,还可以对象其进行修改,不过这里的修改是指可以修改被创建数据库的相关参数,也可以修改数据库名。...

    [多选题]注射时,在(  )情况下,采用较高的注射速率. [单选题]通常,所设置的模具温度是指和制品接触的模腔内表面在(   ). [单选题]反映某一事件发生强度的指标应选用 [判断题]当试样制备之后 ...

  4. Spring源码分析系列-循环依赖和三级缓存

    目录 循环依赖 多级缓存 一级缓存 二级缓存 当循环依赖遇上AOP 三级缓存 Spring三级缓存源码实现 总结 循环依赖   BeanFactory作为bean工厂管理我们的单例bean,那么肯定需 ...

  5. Spring 循环依赖(5.2.x)

    目录 1.回顾getBean过程 2.回顾创建拥有简单依赖关系Bean的过程(类A里依赖类B) 3.Spring是如何解决循环依赖的 4.Spring Bean的代理对象是在什么时候创建的 5.AOP ...

  6. spring无法用三级缓存解决循环依赖的问题分析

    spring无法解决构造器的循环依赖,对上述例子稍微进行改动: @Component("b") public class B {private A a;public B(A a) ...

  7. Spring是如何利用“三级缓存“巧妙解决Bean的循环依赖问题

    前言 循环依赖:就是N个类循环(嵌套)引用. 通俗的讲就是N个Bean互相引用对方,最终形成闭环.用一副经典的图示可以表示成这样(A.B.C都代表对象,虚线代表引用关系): 注意:其实可以N=1,也就 ...

  8. Spring 的循环依赖:真的必须非要三级缓存吗?

    作者:青石路 www.cnblogs.com/youzhibing/p/14337244.html 写作背景 做 Java 开发的,一般都绕不开 Spring,那么面试中肯定会被问到 Spring 的 ...

  9. 解鞍卸甲——手写简易版Spring框架(终):使用三级缓存解决循环依赖问题

    什么是三级缓存 按照目前我们实现的 Spring 框架,是可以满足一个基本需求的,但如果你配置了A.B两个Bean对象互相依赖,那么立马会抛出 java.lang.StackOverflowError ...

最新文章

  1. 部署可扩展的目标检测管道:推理过程(上)
  2. VMware-使用VMware在本地搭建多个CentOS虚机
  3. [导入]SunriseUpload.0.9.1的源码分析(七)
  4. Msfvenonm生成后门
  5. Android之玩转MPAndroidChart让(折线图、柱形图、饼状图、散列图、雷达图)优雅的舞动
  6. Linux笔记-nohup和
  7. 单片机上电总是立即执行按键程序
  8. GDKOI2018游记
  9. 按键扫描——74HC164驱动(二)
  10. ASP.NET偷懒大法三 (利用Attribute特性简化多查询条件拼接sql语句的麻烦)
  11. 无危害有好玩的电脑病毒下载-01期
  12. 前端模块打包工具--webpack
  13. 男性平均寿命要比女性短5至10年
  14. 微处理器系统结构与嵌入式系统设计(二)
  15. 小米手机是什么系统?
  16. 《内功修炼系列》之-递归从入门到入土(收藏版)
  17. 浏览器被hao123篡改怎么办?
  18. android闹钟报告分析,闹钟分析---分析设计报告全解.doc
  19. PokemonGo完美度算法!是风姐还是松岛枫?--工地斗天地斗天马座
  20. JavaScript数据类型 1

热门文章

  1. 2.2. Panel
  2. 【20G】Kaggle数据集强势分析“绝地求生”,攻略吃鸡!
  3. 西岛民宿软件测试,西岛民宿|从废弃建筑变身精品民宿,其中有故事……
  4. 怎么做html网页,怎么做HTML网页
  5. Java基础----员工工资计算器
  6. 软件测试职场焦虑之我对35岁危机的看法
  7. escape() 函数
  8. android平板 作为第二显示器,如何使用安卓设备作为你的电脑或者Mac的第二台显示器...
  9. 江苏理工大学计算机专业怎么样,江苏理工学院是几本?有哪些王牌专业?
  10. Mac OS X上的不同字体位置及功能