Spring源码深度解析:三级缓存机制探究

2024-04-27 04:44

本文主要是介绍Spring源码深度解析:三级缓存机制探究,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Spring框架中,三级缓存机制是容器初始化Bean过程中的一个重要组成部分。它有效地解决了循环依赖的问题,特别是在单例Bean的初始化过程中。本文将深入探讨Spring的三级缓存机制,并通过代码片段来解析其工作原理。

一、三级缓存概述

Spring的三级缓存是为了解决循环依赖问题而设计的。在Spring的IoC容器中,Bean的创建和初始化过程分为多个阶段,其中涉及到了多个缓存。这三个缓存分别是:

  1. 一级缓存(singletonCache):用于存储完全初始化好的单例Bean实例。

  2. 二级缓存(earlySingletonCache):用于存储已经创建好实例但还未进行属性填充和初始化方法调用的单例Bean。

  3. 三级缓存(singletonFactories):存储的是ObjectFactory对象,这些对象能够生成对应Bean的早期引用。

二、三级缓存机制的工作流程

  • 创建Bean实例:当Spring IoC容器需要创建一个Bean时,首先会调用Bean的构造函数来创建实例。此时,这个Bean的实例会被包装成一个ObjectFactory对象,并放入三级缓存中。

  • 属性填充:接着,Spring会尝试为Bean填充属性。如果属性是另一个Bean的引用,那么Spring会尝试去获取这个引用的Bean。如果这个Bean已经存在于一级缓存中,那么直接获取;否则,会检查二级缓存和三级缓存。

  • 处理循环依赖:如果在填充属性时发现依赖的Bean在三级缓存中存在,那么Spring会调用这个ObjectFactory对象来获取Bean的早期引用。然后,将这个早期引用放入二级缓存中,并继续填充属性。这样,即使存在循环依赖,Spring也能够通过早期引用来解决。

  • 初始化Bean:当所有的属性都被填充完毕后,Spring会调用Bean的初始化方法(如果有的话)。此时,Bean的状态从早期引用变成了完全初始化好的实例,并被放入一级缓存中。

  • 完成初始化:最后,Spring会从二级缓存中移除这个Bean的早期引用,并从三级缓存中移除对应的ObjectFactory对象。

三、代码片段解析

以下是一个简化的Spring源码片段,用于说明三级缓存的核心逻辑:

// 假设这是Spring IoC容器的部分实现  public class DefaultSingletonBeanRegistry {  // 一级缓存  private final Map<String, Object> singletonCache = new ConcurrentHashMap<>(256);  // 二级缓存  private final Map<String, Object> earlySingletonCache = new HashMap<>(16);  // 三级缓存  private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);  // ... 其他方法 ...  protected Object getSingleton(String beanName, boolean allowEarlyReference) {  // 首先尝试从一级缓存中获取  Object singletonObject = this.singletonCache.get(beanName);  if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {  // 如果一级缓存中没有,且Bean正在创建中,则尝试从二级和三级缓存中获取  synchronized (this.singletonObjects) {  singletonObject = this.earlySingletonCache.get(beanName);  if (singletonObject == null && allowEarlyReference) {  ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);  if (singletonFactory != null) {  // 从三级缓存中获取ObjectFactory并创建早期引用  singletonObject = singletonFactory.getObject();  this.earlySingletonCache.put(beanName, singletonObject);  this.singletonFactories.remove(beanName);  // ... 后续可能需要移除二级缓存中的早期引用,并放入一级缓存 ...  }  }  }  }  return singletonObject;  }  // ... 其他方法 ...  }

在上面的代码片段中,getSingleton方法用于从缓存中获取Bean实例。它首先检查一级缓存,然后检查二级缓存和三级缓存。如果Bean在三级缓存中存在,则通过调用ObjectFactory的getObject方法来获取早期引用,并将其放入二级缓存中。

四、总结

Spring的三级缓存机制是解决循环依赖问题的重要手段。通过合理利用这三个缓存,Spring能够在Bean的创建和初始化过程中保持灵活性,同时确保Bean的依赖关系能够正确解析。理解这一机制有助于我们更深入地掌握Spring IoC容器的实现原理,并在实际开发中更好地利用Spring框架的特性。

这篇关于Spring源码深度解析:三级缓存机制探究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939550

相关文章

java的reflection机制简介

目的:不传入类的参数情况下获取类。 方法:Class str=Student.class Student是一个类。 注意:java中除开int等基本类型其余都是类,实际上这些类的本质可以看作一种数据类型

解决springboot+vue静态资源刷新后无法访问的问题

一、背景 原项目是有前后端分离设计,测试环境是centos系统,采用nginx代理和转发,项目正常运行。 项目近期上线到正式环境,结果更换了系统环境,需要放到一台windows系统中,前后端打成一个jar包,然后做成系统服务。这台服务器中已经有很多其他服务,都是采用一样的部署方式,所以没办法只能对这个项目进行修改。 二、修改过程 2.1 首先看项目结构 admin是后端代码,使用的是sp

【Java开发面试系列】JVM相关面试题(精选)

【Java开发面试系列】JVM相关面试题(精选) 文章目录 【Java开发面试系列】JVM相关面试题(精选)前言一、JVM组成二、类加载器三、垃圾回收四、JVM实践(调优) 🌈你好呀!我是 山顶风景独好 💝欢迎来到我的博客,很高兴能够在这里和您见面! 💝希望您在这里可以感受到一份轻松愉快的氛围! 💝不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

风电功率预测 | 基于PSO-BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码 风电功率预测 基于粒子群优化算法(Particle Swarm Optimization, PSO)的BP神经网络是一种常见的方法,用于实现风电功率预测。下面是一个基于PSO-BP神经网络实现风电功率预测的一般步骤: 数据准备:收集与风电场发电功率相关的数据,包括风速、风向、温度、湿度等气象数据以及风电场的历史功率数据。 数据预处理:对收

简约的JAVA版本MapReduce和日常No.25

昨天做了一个小调查,说看看想看些啥。大概的分布是这样的,一个1代表一个投票。看来还是2、3比较多。 11111 希望看到"算法"回复1。  111111111111 希望看到"技术细节"回复2。 111111111 希望看到"成长和读书"分享回复3。 还好多人说想看我长啥样,嘛,在我比较正经的时候,就长下面这样。 大图预警!!!! 日常呢,就长这样。 长这

scratch求和 2024年3月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch求和 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 scratch求和 2024年3月电子学会图形化编程Scr

深入浅出Java中的数据结构:LinkedHashMap详解

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛   今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。   我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初

Python程序性能优化:策略与工具深度解析

Python程序性能优化:策略与工具深度解析 一、引言 Python作为一种高级编程语言,因其简洁的语法和强大的功能库而深受开发者的喜爱。然而,Python在性能上常常被诟病为“慢慢的”语言。但在实际应用中,通过一系列的性能优化策略和工具,我们可以显著提升Python程序的运行效率。本文将深入探讨Python程序性能优化的策略和工具,帮助读者打造更加高效、稳定的Python程序。 二、Pyt

二维数组经典题型---环形数组和蛇形矩阵(Java)

文章目录 前言1.环形数组1.1.题目1.2.题目分析1.3.代码展示1.4.不足 2.[蛇形矩阵](https://ac.nowcoder.com/acm/problem/22231)2.1.题目2.2.题目分析2.3.代码展示 总结 前言 每日一题—第四届上海理工大学程序设计全国挑战赛 —环形数组 1.环形数组 1.1.题目 这道题跟牛客网网上的蛇形矩阵相类

深入解析Linux逻辑卷管理器(LVM)

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、Linux的起源与发展 2、什么是逻辑卷管理器(LVM) 二、LVM基础概念  1、物理卷(Physical Volume, PV)  2、卷组(Volume Group, VG) 3、逻辑卷(Logical Volume, LV)  4、