spring在哪个版本中引入三级缓存

不及物动词 其他 26

回复

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

    Spring在版本3.1中引入了三级缓存。

    在Spring的缓存机制中,一级缓存是方法级缓存,即将方法的返回值缓存在内存中,以提高方法的执行效率。二级缓存是基于Spring框架的Bean级别的缓存,将Bean的实例缓存在内存中,以减少Bean的创建和销毁次数。三级缓存是在二级缓存的基础上引入的,用于解决循环依赖的问题。

    在Spring的IoC容器中,当两个或多个Bean存在循环依赖时,Spring会使用三级缓存来解决这个问题。三级缓存的实现是通过缓存Bean的ObjectFactory来实现的,ObjectFactory是一个用于创建Bean实例的工厂接口。Spring将Bean的创建过程分为三个阶段:先创建一个空的Bean实例,然后将Bean的属性注入到实例中,最后初始化Bean。在第三个阶段中,如果发现当前Bean正在被创建中,并且正在等待其他Bean的创建,此时Spring会将当前Bean的ObjectFactory缓存起来,以便在其他Bean创建完成后将其注入到当前Bean中。

    在Spring版本3.1中,引入了三级缓存的概念,以解决循环依赖的问题。通过三级缓存,Spring能够更好地管理Bean的创建过程,保证依赖关系的正确性,提高系统的稳定性和性能。

    总而言之,Spring在版本3.1中引入了三级缓存,用于解决循环依赖的问题,并优化了Bean的创建过程,提高了系统的性能和稳定性。

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

    Spring在版本3.1中引入了三级缓存。

    1. 版本3.1中引入了三级缓存以优化bean的创建和销毁过程。在之前的版本中,Spring使用了两级缓存来管理bean,即singleton缓存和early singleton缓存。而在3.1版本中,引入了一个新的缓存级别,即interned singleton缓存,用于管理已经实例化的单例bean。

    2. 三级缓存的目的是避免循环依赖问题的出现。当存在循环依赖时,三级缓存可以暂时存储实例化过程中正在创建的bean的代理对象,以便在循环依赖中进行解析。

    3. 在三级缓存中,当正在创建的bean在创建过程中需要依赖其他bean时,Spring会首先检查interned singleton缓存,如果该缓存中存在需要的bean的代理对象,则直接返回代理对象,避免进一步的依赖解析。

    4. 如果interned singleton缓存中不存在所需的bean的代理对象,则会继续检查singleton缓存。如果singleton缓存中存在所需的bean的完整实例,则返回实例化对象。

    5. 如果singleton缓存中也不存在所需的bean的实例,则会继续使用early singleton缓存进行解析。如果early singleton缓存中存在所需的bean的代理对象,则返回代理对象。

    总的来说,三级缓存的引入在Spring中解决了循环依赖的问题,并且提高了单例bean的创建和销毁的性能。通过缓存的机制,Spring能够更有效地管理bean的实例化过程,提供更好的性能和可靠性。

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

    Spring框架引入了三级缓存的功能是在4.2版本中。

    在Spring框架中,Bean的创建过程是通过BeanFactory完成的。在3.x版本中,Spring框架使用了双重检查锁定的方式来实现Bean的创建过程的线程安全。然而,双重检查锁定带来了一些性能问题,所以Spring在4.2版本中引入了三级缓存来改进性能。

    三级缓存是一个包含三个Map的数据结构,用于存储Bean的原始定义信息、早期暴露的代理对象和最终的Bean对象。三级缓存的引入可以减少对synchronized关键字的使用,从而提高多线程环境下的性能。

    下面是Spring框架在4.2版本中引入三级缓存的操作流程:

    1. 获取BeanDefinition:当容器需要创建一个Bean时,首先会根据Bean的名称从BeanFactory获取对应的BeanDefinition,BeanDefinition中包含了Bean的所有属性和依赖关系的信息。

    2. 创建Bean实例:容器通过反射机制利用BeanDefinition中的类路径信息创建一个原始的Bean实例,并将其保存到一级缓存中。

    3. 提前暴露代理:如果BeanDefinition中指定了需要提前暴露代理对象,在这一步会将原始的Bean实例包装成代理对象,并将其保存到二级缓存中。这是为了解决循环依赖的问题,提前暴露代理对象可以使得相互依赖的Bean能够使用对方的引用。

    4. 属性注入:将Bean实例中的属性值注入到相应的属性中。如果发现依赖的Bean在二级缓存中已经存在代理对象,则直接使用代理对象进行注入。

    5. 初始化Bean:如果Bean实现了InitializingBean接口或者定义了init-method方法,容器会调用相应的方法对Bean进行初始化。初始化后的Bean将保存在三级缓存中。

    6. 返回Bean:最后,容器会从三级缓存中获取最终的Bean实例,返回给用户使用。

    通过引入三级缓存,Spring框架能够在多线程环境下快速创建Bean实例并解决循环依赖的问题,提高了容器的性能和并发能力。

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

400-800-1024

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

分享本页
返回顶部