spring为什么要有三级缓存

fiy 其他 32

回复

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

    Spring框架在Bean的创建过程中使用了三级缓存机制,其目的是为了提高性能和减少资源消耗。

    首先,我们先来了解一下三级缓存是什么。在Spring框架中,每个Bean的创建过程分为三个阶段:单例Bean的创建、原型Bean的创建以及循环依赖的处理。为了提高性能,Spring使用了三级缓存,分别是singletonObjects,earlySingletonObjects和singletonFactories。

    singletonObjects是用来存储已经创建完成并初始化的单例Bean对象的缓存。这个缓存主要是为了避免循环依赖问题的发生,当一个Bean的创建过程中发现有循环依赖时,它会将当前Bean对象以及所有依赖它的Bean对象放入singletonObjects缓存中。

    earlySingletonObjects是用来存储已经创建完成但尚未初始化的Bean对象的缓存。当Bean的依赖关系解析完成后,Spring框架会将Bean对象放入earlySingletonObjects缓存中,这样可以保证在初始化Bean对象之前,其他Bean对象可以通过依赖注入等方式获取对该Bean对象的引用。

    singletonFactories是用来存储Bean的提供工厂方法的缓存。当Spring框架在创建Bean对象时,如果该Bean对象是通过工厂方法创建的,则会将该工厂方法存放在singletonFactories缓存中。这样可以确保通过工厂方法创建的Bean对象只被创建一次。

    为什么需要这三级缓存呢?主要是为了解决循环依赖的问题。在Spring框架中,循环依赖是指两个或多个Bean对象相互依赖,从而形成一个闭环的依赖关系。如果没有使用缓存机制,当Spring框架遇到循环依赖时,会陷入死循环,并抛出BeanCurrentlyInCreationException异常。通过使用三级缓存,在发生循环依赖时,Spring可以提前将Bean对象放入缓存中,从而避免了死循环的发生。

    此外,使用三级缓存还可以提高Spring创建Bean对象的性能。当Spring框架创建Bean对象时,它首先会在singletonObjects缓存中查找是否存在初始化完成的单例Bean对象。如果存在,则直接返回该对象;否则,继续创建Bean对象。在Bean对象创建完成后,Spring会将该Bean对象放入singletonObjects缓存中,这样下次再需要使用时就可以直接从缓存中获取,从而减少了创建Bean对象的耗时。

    综上所述,Spring使用三级缓存机制是为了解决循环依赖问题和提高性能。通过使用这一机制,Spring框架能够高效地创建和管理Bean对象,从而为应用程序带来更好的性能和用户体验。

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

    Spring框架中三级缓存的存在是为了解决Bean的循环依赖问题。当一个Bean依赖于另一个Bean时,如果两个Bean相互依赖,就会出现循环依赖的情况。为了处理这种情况,Spring引入了三级缓存。

    1. 解决循环依赖问题:
      当一个Bean的创建过程中又依赖于另一个正在创建的Bean时,Spring会将正在创建的Bean提前暴露给BeanFactory,以便其他Bean使用。这就是第一级缓存,它将正在创建的Bean的ObjectFactory提前暴露给其他Bean。

    2. 提高性能:
      Spring框架中的BeanFactory是单例的,并且是懒加载的,因此在第一次获取Bean的时候需要创建和初始化该Bean。在此期间,Spring会将正在创建的Bean缓存到第二级缓存中。当下次再次获取该Bean时,可以直接从第二级缓存中获取,避免重复的创建和初始化操作,提高了性能。

    3. 解决循环依赖的递归调用问题:
      当存在循环依赖的情况时,Spring框架采用了一种特殊的策略,即通过使用ObjectFactory延迟加载Bean的引用,在需要实例化Bean时,暂时用一个ObjectFactory代替,并将其暴露给其他正在创建中的Bean。这样可以解决循环依赖的递归调用问题。

    4. 实现依赖注入:
      Spring框架使用依赖注入来管理Bean之间的依赖关系。当一个Bean需要依赖其他Bean时,Spring会从缓存中获取已经创建过的Bean,并将其注入到该Bean中。通过使用三级缓存,Spring可以在Bean创建的过程中解决循环依赖问题,并确保注入的Bean是已经创建的。

    5. 实现AOP功能:
      Spring框架的AOP功能基于动态代理实现,当一个Bean被代理时,Spring会创建代理对象,并将代理对象缓存到第三级缓存中。每次调用代理对象的方法时,实际上是调用了被代理对象的方法,并对方法进行增强。这样可以在不改变原有代码的情况下,实现横切关注点的功能。通过使用三级缓存,可以避免重复创建代理对象,提高了性能。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring中,三级缓存是为了解决Bean的循环依赖问题而设计的。当一个Bean存在循环依赖时,Spring利用三级缓存来解决依赖关系的建立和处理的问题。

    三级缓存的存在可以确保在解析和创建Bean对象时,能够正确地处理循环依赖的情况,避免出现无限递归或空指针等异常。三级缓存包括了singletonObjects、earlySingletonObjects和singletonFactories三个缓存。

    下面将详细介绍每个级别的缓存作用和操作流程:

    1. singletonObjects缓存:
      singletonObjects缓存是最终存放已经创建完成的单例Bean的地方。在创建Bean的过程中,当一个Bean正在创建的时候,会首先将其放入singletonObjects缓存中,表示这个Bean正在创建中。当Bean创建完成后,会从singletonObjects缓存中移除并放入earlySingletonObjects缓存中。

    2. earlySingletonObjects缓存:
      earlySingletonObjects缓存保存了已经完成实例化,但还没有完成初始化的Bean对象。当一个Bean从singletonObjects缓存中被移除时,会放入earlySingletonObjects缓存中。这个阶段主要是为了处理循环依赖的问题。

    3. singletonFactories缓存:
      singletonFactories缓存保存了用于创建单例对象的Factory对象。在循环依赖的场景中,A依赖B,B依赖A,Spring需要创建A和B两个对象,但由于B依赖A,而A还没有创建完成,所以无法直接创建B。这时,Spring会将创建B的逻辑封装成一个Factory对象,放入singletonFactories缓存中。当A创建完成后,会调用B对象的初始化方法,并从singletonFactories缓存中取出B的Factory对象创建B对象,最终将B对象放入singletonObjects缓存中。

    在整个创建Bean的过程中,Spring会根据Bean的依赖关系和循环依赖的情况,按照合适的顺序将Bean对象从一个缓存移动到另一个缓存,最终完成Bean的创建和初始化。三级缓存的设计可以确保Bean的创建不会陷入无限递归的问题,同时也保证了循环依赖的正确处理。

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

400-800-1024

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

分享本页
返回顶部