您的位置:

深入理解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对象而造成的系统性能问题。