spring三级缓存分别什么时候

fiy 其他 23

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    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年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring框架中的三级缓存是指BeanFactory的三个缓存区域:singletonObjects、earlySingletonObjects和singletonFactories。这三个缓存使用不同的方式来存储和获取Bean对象,以提高Spring应用程序的性能和效率。

    1. singletonObjects(一级缓存):
      singletonObjects缓存是Spring中最常见和最基础的缓存区域。当程序从容器中获取单例Bean时,Spring会首先检查singletonObjects缓存。如果Bean对象已经在缓存中,Spring会直接返回缓存中的对象,避免重复创建和初始化。

    2. earlySingletonObjects(二级缓存):
      earlySingletonObjects缓存是在singletonObjects缓存之后使用的缓存区域。当singletonObjects缓存中没有找到Bean对象时,Spring会尝试从earlySingletonObjects缓存中获取。earlySingletonObjects缓存的作用是为了处理循环依赖的情况,当A对象依赖B对象,而B对象又依赖A对象时,Spring会先创建A对象并放入earlySingletonObjects缓存中,再创建B对象并放入singletonObjects缓存中,最后将A对象从earlySingletonObjects缓存中移动到singletonObjects缓存中。

    3. singletonFactories(三级缓存):
      singletonFactories缓存是最后一个备用缓存区域。当singletonObjects和earlySingletonObjects缓存都没有找到Bean对象时,Spring会尝试从singletonFactories缓存中获取。singletonFactories缓存缓存了创建和初始化Bean对象的工厂方法。当一个Bean的创建过程中发生异常或被循环依赖时,Bean会被放入singletonFactories缓存,以避免重复创建和初始化。

    当程序从容器中获取单例Bean时,Spring会按照上述顺序依次检查三级缓存,直到找到Bean对象或无法创建对象为止。这三级缓存的存在提高了Spring应用程序的性能和效率,避免了重复创建和初始化对象的开销,并处理了循环依赖的情况。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring框架中的三级缓存主要是指BeanFactory、singletonObjects和earlySingletonObjects三个缓存。它们的使用时机如下:

    1. BeanFactory缓存:在Spring容器创建Bean实例之前,先从BeanFactory缓存中查找是否已经存在该Bean的定义。如果存在,则直接返回Bean实例。如果不存在,则继续下一步的操作。

    2. SingletonObjects缓存:如果BeanFactory缓存中不存在Bean的定义,则会检查singletonObjects缓存是否存在该Bean的实例。如果存在,则直接返回Bean实例。否则,继续下一步的操作。

    3. EarlySingletonObjects缓存:如果singletonObjects缓存中也不存在该Bean的实例,则会尝试从earlySingletonObjects缓存中获取Bean的提前暴露的实例。这个缓存主要用于存储正在创建中的Bean实例,以避免循环依赖问题。

    总结来说,三级缓存的使用时机是在Bean实例创建的不同阶段中。先从BeanFactory缓存中查找是否有Bean的定义,然后再从singletonObjects缓存中查找是否有Bean的实例,最后再从earlySingletonObjects缓存中获取Bean的提前暴露实例。如果以上三个缓存中都不存在,则会进入正常的Bean实例创建流程。

    值得注意的是,BeanFactory缓存和singletonObjects缓存是线程安全的,而earlySingletonObjects缓存则不是线程安全的。因此在使用过程中要确保多线程安全。此外,earlySingletonObjects缓存一般不对外暴露,只在Spring内部使用,外部使用时主要应用在解决循环依赖问题。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部