一、什么是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需要三级缓存解决循环依赖,而不是二级缓存?

    来源:https://www.cnblogs.com/semi-sub/p/13548479.html 在使用spring框架的日常开发中,bean之间的循环依赖太频繁了,spring已经帮我们去解决 ...

  2. Spring使用三级缓存解决循环依赖?终于完全弄明白了

    文章阅读前推荐 推荐先去看看源码,源码很短,但是对于我们在脑子里构建一个完整思路很重要.看起来非常简单,只需要双击shift,全局查找文件:AbstractAutowireCapableBeanFac ...

  3. 京东一面:Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?我懵了。。...

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:cnblogs.com/semi-sub/p/13548479.html 前言 bean生命周期 三级缓存解决循环依赖 总结 ...

  4. Spring三级缓存解决循环依赖问题详解

    spring三级缓存解决循环依赖问题详解 前言 这段时间阅读了spring IOC部分的源码.在学习过程中,自己有遇到过很多很问题,在上网查阅资料的时候,发现很难找到一份比较全面的解答.现在自己刚学习 ...

  5. Spring——三级缓存解决循环依赖详解

    三级缓存解决循环依赖详解 一.什么是三级缓存 二.三级缓存详解 Bean实例化前 属性赋值/注入前 初始化后 总结 三.怎么解决的循环依赖 四.不用三级缓存不行吗 五.总结 一.什么是三级缓存 就是在 ...

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

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

  7. Spring三级缓存解决循环依赖

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

  8. 手写Spring-第十六章-旋转吧雪月花!用三级缓存解决循环依赖

    前言 循环依赖,一直是一个令人头疼的问题.虽然我们一般情况下会尽量避免这种情况的发生,但很多时候它会在无意识的情况下出现.比如隔了好几个bean之后,发现循环起来了.那么什么是循环依赖呢?其实就是A依 ...

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

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

最新文章

  1. ESP8266 问题
  2. Visual Studio registry capture utility 已停止工作的解决办法
  3. 【深度学习】什么是目标检测中的平均精度均值(mAP)?
  4. 为什么S/4HANA的销售订单创建会触发生产订单的创建 1
  5. oracle oemrpt数据库显现
  6. 织梦联动类别-地区调用不显示第三级城市的解决方法
  7. asp.net动态加载css
  8. springboot 与shiro整合
  9. devops项目经理_DevOps:如何避免交接导致项目死亡
  10. Practice:Demonstrating the Key TCP/IP Protocols
  11. java栈最小值的实现,关于java:算法图解如何找出栈中的最小值
  12. C#中winform使用相对路径读取文件的方法
  13. Builder模式——自由扩展你的项目
  14. 联想T110 8G优盘 安国AU6983主控量产成功
  15. matlab语言fcm,【上海校区】FCM算法原理及MATLAB实现
  16. excel 将两列数据合并,以逗号分隔
  17. AD16 禁止联网操作
  18. java:mysql基础语法
  19. 第十周 项目二 阴险的小刚
  20. Ubuntu 重置登录密码

热门文章

  1. QCon北京2015:永不止步的前端专题前瞻
  2. 在Unity3D中开发的Dissolve Shader
  3. 了解JDK8 Stream数据流效率吗?千万级数据量性能如何?
  4. 装备制造业多项目管理实践与思考︱湖北海工院项目管理室主任王景凤
  5. 加强身份鉴别,宁盾双因素认证提升步长制药远程办公账号安全
  6. 小猪的Python学习之旅 —— 17.Python数据分析:我主良缘交友了解下
  7. android切换账号登录界面,华为游戏切换安卓账号登陆界面
  8. 50道简单易学的家常菜谱(附图) - 健康程序员,至尚生活!
  9. 【行研报告】2021中国品牌数字化实战研究报告—附下载链接
  10. 什么叫“商业性性服务”