spring三级缓存分别什么时候
-
Spring的三级缓存是在Bean的创建过程中使用的,具体分别是什么时候呢?
首先,第一级缓存是在获取单例Bean实例的时候使用的。当调用getBean()方法获取Bean时,Spring会首先从一级缓存中查找是否已经创建了该Bean实例。如果已经创建,就直接返回缓存中的实例;如果没有创建,才会进入后续的创建流程。
其次,如果一级缓存没有命中,Spring会进入第二级缓存。第二级缓存是在创建Bean实例的过程中使用的。当调用getBean()方法创建Bean时,如果一级缓存没有命中,Spring会判断是否支持二级缓存。如果支持,就会查找二级缓存中是否已经存在了该Bean实例的代理对象。如果存在,就直接返回代理对象;如果不存在,就进行后续的Bean创建操作。
然后,如果二级缓存也没有命中,Spring会进入第三级缓存。第三级缓存是在创建Bean实例的过程中使用的。当调用getBean()方法创建Bean时,如果一级和二级缓存都没有命中,Spring会判断是否支持三级缓存。如果支持,就会从三级缓存中查找是否已经存在了该Bean实例的原始对象。如果存在,就使用原始对象创建代理对象并返回;如果不存在,就进行后续的Bean创建操作。
综上所述,Spring的三级缓存分别是在获取单例Bean实例、创建Bean实例的过程中使用的。通过使用多级缓存,可以提高Bean的创建效率,减少重复创建的开销。
1年前 -
Spring框架中的三级缓存是指BeanFactory的三个缓存区域:singletonObjects、earlySingletonObjects和singletonFactories。这三个缓存使用不同的方式来存储和获取Bean对象,以提高Spring应用程序的性能和效率。
-
singletonObjects(一级缓存):
singletonObjects缓存是Spring中最常见和最基础的缓存区域。当程序从容器中获取单例Bean时,Spring会首先检查singletonObjects缓存。如果Bean对象已经在缓存中,Spring会直接返回缓存中的对象,避免重复创建和初始化。 -
earlySingletonObjects(二级缓存):
earlySingletonObjects缓存是在singletonObjects缓存之后使用的缓存区域。当singletonObjects缓存中没有找到Bean对象时,Spring会尝试从earlySingletonObjects缓存中获取。earlySingletonObjects缓存的作用是为了处理循环依赖的情况,当A对象依赖B对象,而B对象又依赖A对象时,Spring会先创建A对象并放入earlySingletonObjects缓存中,再创建B对象并放入singletonObjects缓存中,最后将A对象从earlySingletonObjects缓存中移动到singletonObjects缓存中。 -
singletonFactories(三级缓存):
singletonFactories缓存是最后一个备用缓存区域。当singletonObjects和earlySingletonObjects缓存都没有找到Bean对象时,Spring会尝试从singletonFactories缓存中获取。singletonFactories缓存缓存了创建和初始化Bean对象的工厂方法。当一个Bean的创建过程中发生异常或被循环依赖时,Bean会被放入singletonFactories缓存,以避免重复创建和初始化。
当程序从容器中获取单例Bean时,Spring会按照上述顺序依次检查三级缓存,直到找到Bean对象或无法创建对象为止。这三级缓存的存在提高了Spring应用程序的性能和效率,避免了重复创建和初始化对象的开销,并处理了循环依赖的情况。
1年前 -
-
Spring框架中的三级缓存主要是指BeanFactory、singletonObjects和earlySingletonObjects三个缓存。它们的使用时机如下:
-
BeanFactory缓存:在Spring容器创建Bean实例之前,先从BeanFactory缓存中查找是否已经存在该Bean的定义。如果存在,则直接返回Bean实例。如果不存在,则继续下一步的操作。
-
SingletonObjects缓存:如果BeanFactory缓存中不存在Bean的定义,则会检查singletonObjects缓存是否存在该Bean的实例。如果存在,则直接返回Bean实例。否则,继续下一步的操作。
-
EarlySingletonObjects缓存:如果singletonObjects缓存中也不存在该Bean的实例,则会尝试从earlySingletonObjects缓存中获取Bean的提前暴露的实例。这个缓存主要用于存储正在创建中的Bean实例,以避免循环依赖问题。
总结来说,三级缓存的使用时机是在Bean实例创建的不同阶段中。先从BeanFactory缓存中查找是否有Bean的定义,然后再从singletonObjects缓存中查找是否有Bean的实例,最后再从earlySingletonObjects缓存中获取Bean的提前暴露实例。如果以上三个缓存中都不存在,则会进入正常的Bean实例创建流程。
值得注意的是,BeanFactory缓存和singletonObjects缓存是线程安全的,而earlySingletonObjects缓存则不是线程安全的。因此在使用过程中要确保多线程安全。此外,earlySingletonObjects缓存一般不对外暴露,只在Spring内部使用,外部使用时主要应用在解决循环依赖问题。
1年前 -