深入理解Spring框架中三级缓存运作机制

一、什么是Spring框架中的三级缓存

Spring框架中的三级缓存指的是“单例对象池”,它是Spring框架中对单例对象进行缓存的机制,可以提高应用程序的性能。它包含了三个缓存层次:

  • singletonObjects:缓存已经实例化的单例对象。
  • earlySingletonObjects:缓存正在创建中的单例对象,这些对象对应的bean还未执行完构造函数、初始化方法等操作。
  • singletonFactories:缓存的是ObjectFactory类型的对象。对于“原型范围”的Bean实例,为了保证每次都能新建一个,只能使用对象工厂进行Bean的初始化。

三层缓存按照优先级逐渐降低。

下面我们将深入理解三级缓存的运作机制。

二、Spring框架三级缓存的运作机制

1、缓存依赖注入(DI)

当程序启动时,Spring容器会读取所有配置的Bean信息,将它们加入到缓存中。而当程序需要一个Bean时,容器就会直接从缓存中获取这个Bean,而不是重新创建一个。在获取Bean的过程中,容器遇到依赖注入的需求时,会从缓存中依次查找对应的Bean是否已经存在,如果已经存在,则直接返回,如果不存在,则创建这个Bean,并将其添加到缓存中。

2、缓存初始化

在容器初始化时,会把所有singleton类型的Bean都加入到singletonObjects缓存中,此时singletonFactories缓存为空。当需要获取一个Bean时,会先从singletonObjects缓存中寻找,如果找不到,会创建一个新的实例,并且存储在earlySingletonObjects缓存中,至此,对象就形成了一个单例工厂模型。在实例创建完成后,会将其从earlySingletonObjects移动到singletonObjects缓存中。

3、延迟加载初始化

当Bean是通过延迟加载方式(例如:@Lazy)初始化时,在容器初次启动时,该Bean只被加入到singletonFactories缓存中。

当程序需要获取该Bean时,Spring会查找该Bean是否已经创建过了。如果还未创建,它会从singletonFactories缓存中获取ObjectFactory对象,并调用getObject()方法获取该Bean,并且形成一个单例工厂模型。最后把Bean放入earlySingletonObjects缓存中,等待继续完成创建和初始化。如果该Bean已经创建了,那么放回缓存中已经存在的同一个实例。

4、一个案例

为了更好的理解三级缓存工作机制,下面带着案例来说明:

public class App {
   public static void main(String[] args) {
      AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
      context.register(AppConfig.class);

      System.out.println("------容器启动完成------");
      ((Student)context.getBean("student")).say();
      ((Student)context.getBean("student")).say();
      ((Student)context.getBean("student")).say();
   }
}

@Configuration
public class AppConfig {
   @Bean(name="student")
   @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
   public Student getStudent() {
      System.out.println("------singletonFactories------");
      return new Student();
   }
}

class Student{
    int age = 1;
    public void say(){
        System.out.println(age);
        age++;
    }
}

运行后的结果为:

------容器启动完成------
------singletonFactories------
1
2
3

在上面的例子中,注解了@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON),将参数设置成单例模式,按照上述的三层缓存逻辑,当请求student Bean时,将在三级别缓存中依次查找,同时在对象工厂缓存中创建bean,并放入earlySingletonObjects缓存中,当构造完成后,即调用Student Bean的初始化方法后,将该对象装入singletonObjects缓存中,等待进一步的操作。

三、总结

理解Spring框架的三级缓存的运行机制可以帮助我们更好地使用Spring框架,提高应用程序的性能。三级缓存是Spring框架中对单例对象进行缓存的机制,包含了singletonObjects、earlySingletonObjects和singletonFactories三层缓存。在获取Bean的过程中,容器遇到依赖注入的需求时,会从缓存中依次查找对应的Bean是否已经存在,如果已经存在,则直接返回,如果不存在,则创建这个Bean,并将其添加到缓存中。通过三层缓存的方式,Spring实现了Bean的单例模式,有效避免了因频繁创建和销毁Bean对象而造成的系统性能问题。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/288765.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-24 03:00
下一篇 2024-12-24 03:00

相关推荐

  • Ojlat:一款快速开发Web应用程序的框架

    Ojlat是一款用于快速开发Web应用程序的框架。它的主要特点是高效、易用、可扩展且功能齐全。通过Ojlat,开发人员可以轻松地构建出高质量的Web应用程序。本文将从多个方面对Oj…

    编程 2025-04-29
  • Zlios——一个多功能的开发框架

    你是否在开发过程中常常遇到同样的问题,需要不断去寻找解决方案?你是否想要一个多功能、易于使用的开发框架来解决这些问题?那么,Zlios就是你需要的框架。 一、简介 Zlios是一个…

    编程 2025-04-29
  • agavi开发框架

    Agavi是一个基于MVC模式的Web应用程序开发框架,以REST和面向资源的设计为核心思想。本文章将从Agavi的概念、优点、使用方法和实例等方面进行详细介绍。 一、概念 Aga…

    编程 2025-04-29
  • Python unittest框架用法介绍

    Python unittest框架是Python自带的一种测试框架,可以用来编写并运行测试用例。在本文中,我们将从以下几个方面详细介绍Python unittest框架的使用方法和…

    编程 2025-04-29
  • com.alipay.sofa.bolt框架

    com.alipay.sofa.bolt框架是一款高性能、轻量级、可扩展的RPC框架。其广泛被应用于阿里集团内部服务以及阿里云上的服务。该框架通过NIO支持高并发,同时还内置了多种…

    编程 2025-04-29
  • Python 数据缓存及其应用

    本文将为大家详细介绍Python数据缓存,并提供相关代码示例。 一、Python 数据缓存基础概念 Python 是一种解释型语言,每次执行完一条语句后就会将内存中的结果清空,如果…

    编程 2025-04-29
  • Python缓存图片的处理方式

    本文将从多个方面详细阐述Python缓存图片的处理方式,包括缓存原理、缓存框架、缓存策略、缓存更新和缓存清除等方面。 一、缓存原理 缓存是一种提高应用程序性能的技术,在网络应用中流…

    编程 2025-04-29
  • Django框架:从简介到项目实战

    本文将从Django的介绍,以及如何搭建Django环境开始,逐步深入到Django模型、视图、模板、表单,最后通过一个小型项目实战,进行综合性的应用,让读者获得更深入的学习。 一…

    编程 2025-04-28
  • LuaEP:一款强大的Lua开发框架

    LuaEP是一个集成了可以快速开发web应用程序所需的组件的Lua开发框架。它以Lua语言为基础,提供了许多常用接口和库,使得开发者不需要从头开始编写web应用程序,而是专注于业务…

    编程 2025-04-28
  • Java持久层框架的复合主键实现

    用Java持久层框架来操作数据库时,复合主键是常见的需求。这篇文章将详细阐述javax.persistence复合主键的实现方式,并提供完整的示例代码。 一、复合主键的定义 复合主…

    编程 2025-04-27

发表回复

登录后才能评论