spring的三级缓存:

Spring 容器的“三级缓存”

Spring 容器的整个生命周期中,单例Bean对象是唯一的。即可以使用缓存来加速访问

Spring 源码中使用了大量的 Cache 手段,其中在循环依赖问题的解决过程中就使用了“三级缓存”

三级缓存的意义

singletonObject:一级缓存,存放完全实例化且属性赋值完成的 Bean ,可以直接使用

earlySingletonObject:二级缓存,存放早期 Bean 的引用,尚未装配属性的 Bean

singletonFactories:三级缓存,存放实例化完成的 Bean 工厂

除了三级缓存,还有另外两个缓存

singletonsCurrentlyInCreation: bean 在创建的过程中都会存储在此,创建完成移出

alreadyCreated:存放至少被创建一次的 bean,不会重复。即标记 bean 是否创建完成

原文链接:https://blog.csdn.net/weixin_44181671/article/details/108630950

对于Spring循环依赖的情况总结如下:

不能解决的情况:

  1. 构造器注入循环依赖
  2. prototype field属性注入循环依赖

能解决的情况

  1. field属性注入(setter方法注入)循环依赖

spring ioc 内部的三级缓存保证了它不会出现循环依赖问题。为什么呢?

https://blog.csdn.net/weixin_44181671/article/details/108630950

但最后循环依赖最终是设计层面的问题,应该从设计层面来避免它,以免后续系统难以维护。

spring的三级缓存的更多相关文章

  1. Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)

    本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...

  2. 曹工说Spring Boot源码(29)-- Spring 解决循环依赖为什么使用三级缓存,而不是二级缓存

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  3. 面试官:连Spring三级缓存都答不好,自己走还是我送你?

    面试官:简历上写了精通Spring,那你回答一下Spring为什么用“三级缓存”去解决循环依赖? 我:.......应该有三个缓存的map结构 面试官:具体回答一下 我:平时没认真深入过 面试官:公司 ...

  4. Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?

    前言 在研究 『 Spring 是如何解决循环依赖的 』 的时候,了解到 Spring 是借助三级缓存来解决循环依赖的. 同样在上一节留下了疑问: 循环依赖为什么要使用三级缓存?而不是使用二级缓存? ...

  5. Spring 的循环依赖,源码详细分析 → 真的非要三级缓存吗

    开心一刻 吃完晚饭,坐在院子里和父亲聊天 父亲:你有什么人生追求? 我:金钱和美女 父亲对着我的头就是一丁弓,说道:小小年纪,怎么这么庸俗,重说一次 我:事业与爱情 父亲赞赏的摸了我的头,说道:嗯嗯, ...

  6. Spring如何使用三级缓存解决循环依赖

    Spring如何使用三级缓存解决循环依赖 首先来了解一下什么是循环依赖 @Component public class A { @Autowired B b; } @Component public ...

  7. Spring框架源码干货分享之三级缓存和父子工厂

    记录并分享一下本人学习spring源码的过程,有什么问题或者补充会持续更新.欢迎大家指正! 环境: spring5.X + idea 建议:学习过程中要开着源码一步一步过 Spring中对象的创建宏观 ...

  8. Spring bean装配流程和三级缓存

    马士兵 源码方法论 不要忽略源码中的注释 先梳理脉络,再深入细节 大胆猜测.小心求证 见名知意 hold on 对源码有兴趣的都是变态 为了钱! Spring IoC Spring容器帮助管理对象,不 ...

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

    前提知识 1.解决循环依赖的核心依据:实例化和初始化步骤是分开执行的 2.实现方式:三级缓存 3.lambda表达式的延迟执行特性 spring源码执行逻辑 核心方法refresh(), popula ...

  10. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

随机推荐

  1. 给 Python 添加进度条 | 给小白的 tqdm 精炼实例!

    给 Python 添加进度条 | 给小白的 tqdm 精炼实例! 假设我们有一个循环: for i in range(100): do_something() # 这里做某些事 假设 do_somet ...

  2. DataV Note:让Jupyter Notebook绽放新活力

    一.导读 Jupyter Notebook的官网定义:是一个基于网络的交互式计算平台.该笔记本结合了实时代码.方程式.叙述性文本.可视化.交互式仪表板和其他媒体.换句话来说,假如你有数据加工.数据分析 ...

  3. 微软宣布更新SymCrypt加密库,新增对PQC算法的支持

    转载链接:https://mp.weixin.qq.com/s/aWXzPTWhxFpJVP1s0iwAtw 2024年9月9日,微软(Microsoft)在其博客中宣布,已开始在其开源核心加密库Sy ...

  4. TCP的网络编程基础

    服务器建立 ServerSocket 对象ServerSocket 对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员.也就是说, 服务器必须事先建立一个等待客户请求建立套接字的 连接 ...

  5. HashMap的底层实现原理? HashMap 和 Hashtable的异同? 负载因子值的大小,对HashMap有什么影响?

     1. HashMap的底层实现原理 HashMap的底层:数组+链表 (jdk7及之前) 数组+链表+红黑树 (jdk 8)HashMap的底层实现原理?以jdk7为例说明: HashMap map ...

  6. ctfshow--web7 sql注入空格过滤

    ?id=10//union//select//1,database(),3//%23查看库名 查看表名 -1/**/union/**/select/**/1,(select/**/group_conc ...

  7. Linux中ARP学习和老化机制

    本文分享自天翼云开发者社区<Linux中ARP学习和老化机制> 作者:云云生息 ARP学习和老化机制在Linux网络通信中起着至关重要的作用.ARP(Address Resolution ...

  8. 阿里的DataV和QuickBi区别

    首先说下DataV吧 分为老版和新版(二者之间没有什么太大的差别,存在的基本都是组件上的配置或是更多不同组件的新增,但是如果你是在项目上进行开发,你首先要知道客户用的DataV用的是什么版本,如果你们 ...

  9. PHP常量与数据类型

    PHP常量与数据类型 PHP常量 在PHP中,常量是值在脚本执行期间不会改变的量.常量使用define()函数或const关键字来定义. 使用define()函数: define("GREE ...

  10. have my hair cut

    标题致敬传奇抗压王裤子. 今天去剪了头发.体验很好,老师帅. 但是还是一直很不安 我们 i 人剪了头发是这样的 剪头发不是换发型 但大概率得换 而且很快会剪短 乌龟的壳换了形状 或是变薄 肯定不安 一 ...