一、什么是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对象而造成的系统性能问题。