什么是Spring三级缓存 对象在三级缓存中的创建流程 【三级缓存 循环依赖】
一、什么是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三级缓存 对象在三级缓存中的创建流程 【三级缓存 循环依赖】相关推荐
- Spring 源码解析 - Bean创建过程 以及 解决循环依赖
一.Spring Bean创建过程以及循环依赖 上篇文章对 Spring Bean资源的加载注册过程进行了源码梳理和解析,我们可以得到结论,资源文件中的 bean 定义信息,被组装成了 BeanDef ...
- Spring IoC 源码系列(四)bean创建流程与循环依赖问题分析
创建单例 bean 的代码细节在 org.springframework.beans.factory.support.AbstractBeanFactory#getBean 中,getBean 顾名思 ...
- mysql 中修改对象_在MySQL中,创建一个数据库后,还可以对象其进行修改,不过这里的修改是指可以修改被创建数据库的相关参数,也可以修改数据库名。...
[多选题]注射时,在( )情况下,采用较高的注射速率. [单选题]通常,所设置的模具温度是指和制品接触的模腔内表面在( ). [单选题]反映某一事件发生强度的指标应选用 [判断题]当试样制备之后 ...
- Spring源码分析系列-循环依赖和三级缓存
目录 循环依赖 多级缓存 一级缓存 二级缓存 当循环依赖遇上AOP 三级缓存 Spring三级缓存源码实现 总结 循环依赖 BeanFactory作为bean工厂管理我们的单例bean,那么肯定需 ...
- Spring 循环依赖(5.2.x)
目录 1.回顾getBean过程 2.回顾创建拥有简单依赖关系Bean的过程(类A里依赖类B) 3.Spring是如何解决循环依赖的 4.Spring Bean的代理对象是在什么时候创建的 5.AOP ...
- spring无法用三级缓存解决循环依赖的问题分析
spring无法解决构造器的循环依赖,对上述例子稍微进行改动: @Component("b") public class B {private A a;public B(A a) ...
- Spring是如何利用“三级缓存“巧妙解决Bean的循环依赖问题
前言 循环依赖:就是N个类循环(嵌套)引用. 通俗的讲就是N个Bean互相引用对方,最终形成闭环.用一副经典的图示可以表示成这样(A.B.C都代表对象,虚线代表引用关系): 注意:其实可以N=1,也就 ...
- Spring 的循环依赖:真的必须非要三级缓存吗?
作者:青石路 www.cnblogs.com/youzhibing/p/14337244.html 写作背景 做 Java 开发的,一般都绕不开 Spring,那么面试中肯定会被问到 Spring 的 ...
- 解鞍卸甲——手写简易版Spring框架(终):使用三级缓存解决循环依赖问题
什么是三级缓存 按照目前我们实现的 Spring 框架,是可以满足一个基本需求的,但如果你配置了A.B两个Bean对象互相依赖,那么立马会抛出 java.lang.StackOverflowError ...
最新文章
- 部署可扩展的目标检测管道:推理过程(上)
- VMware-使用VMware在本地搭建多个CentOS虚机
- [导入]SunriseUpload.0.9.1的源码分析(七)
- Msfvenonm生成后门
- Android之玩转MPAndroidChart让(折线图、柱形图、饼状图、散列图、雷达图)优雅的舞动
- Linux笔记-nohup和
- 单片机上电总是立即执行按键程序
- GDKOI2018游记
- 按键扫描——74HC164驱动(二)
- ASP.NET偷懒大法三 (利用Attribute特性简化多查询条件拼接sql语句的麻烦)
- 无危害有好玩的电脑病毒下载-01期
- 前端模块打包工具--webpack
- 男性平均寿命要比女性短5至10年
- 微处理器系统结构与嵌入式系统设计(二)
- 小米手机是什么系统?
- 《内功修炼系列》之-递归从入门到入土(收藏版)
- 浏览器被hao123篡改怎么办?
- android闹钟报告分析,闹钟分析---分析设计报告全解.doc
- PokemonGo完美度算法!是风姐还是松岛枫?--工地斗天地斗天马座
- JavaScript数据类型 1
热门文章
- 2.2. Panel
- 【20G】Kaggle数据集强势分析“绝地求生”,攻略吃鸡!
- 西岛民宿软件测试,西岛民宿|从废弃建筑变身精品民宿,其中有故事……
- 怎么做html网页,怎么做HTML网页
- Java基础----员工工资计算器
- 软件测试职场焦虑之我对35岁危机的看法
- escape() 函数
- android平板 作为第二显示器,如何使用安卓设备作为你的电脑或者Mac的第二台显示器...
- 江苏理工大学计算机专业怎么样,江苏理工学院是几本?有哪些王牌专业?
- Mac OS X上的不同字体位置及功能