首页 > 其他分享 >Spring中三级缓存详细讲解

Spring中三级缓存详细讲解

时间:2025-01-12 23:28:37浏览次数:3  
标签:初始化 缓存 Spring beanName 二级缓存 Bean 讲解 三级

1、Spring三级缓存是什么,过程是怎么样的?

Spring 中的三级缓存主要用于单例 Bean 的生命周期管理,特别是在循环依赖时,它通过不同阶段暴露 Bean 实例来确保依赖注入的顺利完成。缓存的内容如下:

  1. 一级缓存 (singletonObjects)存储完全初始化的单例 Bean。该缓存中存储的是已经完成初始化的 Bean 对象,包括所有的属性注入和生命周期回调方法(如 @PostConstruct)都已完成。

  2. 二级缓存 (earlySingletonObjects)存储实例化但尚未完成所有初始化步骤的 Bean 引用。也就是 Bean 已经完成了实例化,并完成了依赖注入(如字段注入),但可能还没有执行初始化方法(如 @PostConstruct)。二级缓存用于解决循环依赖问题,当需要注入的 Bean 还没有完全初始化时,可以先返回该 Bean 的早期引用。

  3. 三级缓存 (singletonFactories)存储的是创建 Bean 的工厂(ObjectFactory),而不是直接存储 Bean 实例。这些工厂延迟返回真正的 Bean 实例,直到它们完成初始化。三级缓存用于处理 循环依赖 的核心,当一个 Bean 处于创建过程中,另一个 Bean 依赖它时,可以从三级缓存中获取一个工厂对象,该工厂会在 Bean 完全初始化后,生成一个完整的 Bean 实例。

2、从缓存中获取单例对象

2.1、代码解读

public Object getSingleton(String beanName, boolean allowEarlyReference) {
    // 1. 检查一级缓存,获取已完成初始化的 Bean
    Object singletonObject = this.singletonObjects.get(beanName);
    if (singletonObject == null && this.singletonsCurrentlyInCreation.contains(beanName)) {
        // 2. 如果一级缓存没有,且 Bean 正在创建中,则检查二级缓存
        singletonObject = this.earlySingletonObjects.get(beanName);
        if (singletonObject == null && allowEarlyReference) {
            // 3. 如果二级缓存也没有,允许提前引用时,检查三级缓存
            ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
            if (singletonFactory != null) {
                // 4. 从三级缓存中获取 Bean 实例
                singletonObject = singletonFactory.getObject();
                // 5. 将生成的对象放入二级缓存
                this.earlySingletonObjects.put(beanName, singletonObject);
                // 6. 从三级缓存中移除工厂
                this.singletonFactories.remove(beanName);
            }
        }
    }
    // 7. 返回从缓存中获取的单例对象
    return singletonObject;
}

2.2、执行流程

  1. 一级缓存 (singletonObjects):
    检查一级缓存,获取完全初始化的 Bean。
    如果一级缓存中存在该对象,则直接返回。

  2. 二级缓存 (earlySingletonObjects):
    如果一级缓存中没有找到该对象,且该对象正在创建过程中(this.singletonsCurrentlyInCreation),则检查二级缓存。
    如果二级缓存中存在早期暴露的 Bean,则直接返回。

  3. 三级缓存 (singletonFactories):
    如果二级缓存中也没有,并且允许提前引用(allowEarlyReference 为 true),则从三级缓存中获取工厂对象(ObjectFactory)。
    调用 ObjectFactory.getObject() 方法生成 Bean 实例。
    将生成的实例放入二级缓存,同时从三级缓存中移除对应的工厂。

标签:初始化,缓存,Spring,beanName,二级缓存,Bean,讲解,三级
From: https://blog.csdn.net/a147775/article/details/145101962

相关文章

  • 基于SpringBoot+Vue农场投入品运营线上管理系统的设计与实现
    博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联......
  • 基于SpringBoot+Vue在线项目管理与任务分配中的应用的设计与实现
    博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联......
  • springboot毕设 花店管理系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着生活品质的提升,鲜花作为传递情感与美化生活的媒介,其市场需求日益增长。传统花店在运营过程中面临着诸多挑战,如库存管理复杂、客户信息管理混乱、......
  • springboot毕设 汉中市旅游综合服务平台 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景汉中市,作为中国历史文化名城,拥有丰富的自然景观和深厚的文化底蕴,吸引了众多国内外游客前来观光旅游。然而,随着旅游业的快速发展,传统的旅游服务方式已......
  • JAVA开源免费项目 基于Vue和SpringBoot的物资管理系统(附源码)
    本文项目编号T112,文末自助获取源码\color{red}{T112,文末自助获取源码}......
  • JAVA开源免费项目 基于Vue和SpringBoot的学生网上请假系统(附源码)
    本文项目编号T111,文末自助获取源码\color{red}{T111,文末自助获取源码}......
  • 基于django中医药数据可视化平台(源码+lw+部署文档+讲解),源码可白嫖!
    摘要时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,中医药管理平台当然不能排除在外。中医药数据可视化平台是在实际应用和软件工程的开发原理之上,运用Python语言、ECharts技术、爬虫技术以及Django框架进行开发,可以让用户实现在线......
  • 2025毕设springboot 电影院网上售票系统论文+源码
    系统程序文件列表开题报告内容研究背景随着互联网技术的迅猛发展和人们生活水平的提高,电影院作为重要的休闲娱乐场所,其经营方式和服务模式也在不断变化。传统的电影院售票方式主要依赖于线下的售票窗口和自动售票机,但随着在线购票习惯的普及,网上售票系统已成为电影院不可或......
  • 2025毕设springboot 电影网站系统论文+源码
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字媒体已成为人们日常生活中不可或缺的一部分,其中电影作为一种重要的文化娱乐形式,深受全球观众的喜爱。近年来,随着在线观影平台的兴起,人们越来越倾向于通过网络平台浏览电影信息、购票以及参与影片讨论。电......
  • 基于springboot和vue的教务(学生)管理系统
    1、项目介绍基于Springboot和vue的教务(学生)管理系统拥有三种角色:管理员、教师和学生管理员:班级管理、课程管理、创建课程、管理员管理、教师管理、学生管理、选课修改、院系管理、专业管理、设置用户权限等教师:成绩录入、课表查看、授课查询等学生:查看选修课程、选课、成......