spring在哪个版本中引入三级缓存
-
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年前 -
Spring在版本3.1中引入了三级缓存。
-
版本3.1中引入了三级缓存以优化bean的创建和销毁过程。在之前的版本中,Spring使用了两级缓存来管理bean,即singleton缓存和early singleton缓存。而在3.1版本中,引入了一个新的缓存级别,即interned singleton缓存,用于管理已经实例化的单例bean。
-
三级缓存的目的是避免循环依赖问题的出现。当存在循环依赖时,三级缓存可以暂时存储实例化过程中正在创建的bean的代理对象,以便在循环依赖中进行解析。
-
在三级缓存中,当正在创建的bean在创建过程中需要依赖其他bean时,Spring会首先检查interned singleton缓存,如果该缓存中存在需要的bean的代理对象,则直接返回代理对象,避免进一步的依赖解析。
-
如果interned singleton缓存中不存在所需的bean的代理对象,则会继续检查singleton缓存。如果singleton缓存中存在所需的bean的完整实例,则返回实例化对象。
-
如果singleton缓存中也不存在所需的bean的实例,则会继续使用early singleton缓存进行解析。如果early singleton缓存中存在所需的bean的代理对象,则返回代理对象。
总的来说,三级缓存的引入在Spring中解决了循环依赖的问题,并且提高了单例bean的创建和销毁的性能。通过缓存的机制,Spring能够更有效地管理bean的实例化过程,提供更好的性能和可靠性。
1年前 -
-
Spring框架引入了三级缓存的功能是在4.2版本中。
在Spring框架中,Bean的创建过程是通过BeanFactory完成的。在3.x版本中,Spring框架使用了双重检查锁定的方式来实现Bean的创建过程的线程安全。然而,双重检查锁定带来了一些性能问题,所以Spring在4.2版本中引入了三级缓存来改进性能。
三级缓存是一个包含三个Map的数据结构,用于存储Bean的原始定义信息、早期暴露的代理对象和最终的Bean对象。三级缓存的引入可以减少对synchronized关键字的使用,从而提高多线程环境下的性能。
下面是Spring框架在4.2版本中引入三级缓存的操作流程:
-
获取BeanDefinition:当容器需要创建一个Bean时,首先会根据Bean的名称从BeanFactory获取对应的BeanDefinition,BeanDefinition中包含了Bean的所有属性和依赖关系的信息。
-
创建Bean实例:容器通过反射机制利用BeanDefinition中的类路径信息创建一个原始的Bean实例,并将其保存到一级缓存中。
-
提前暴露代理:如果BeanDefinition中指定了需要提前暴露代理对象,在这一步会将原始的Bean实例包装成代理对象,并将其保存到二级缓存中。这是为了解决循环依赖的问题,提前暴露代理对象可以使得相互依赖的Bean能够使用对方的引用。
-
属性注入:将Bean实例中的属性值注入到相应的属性中。如果发现依赖的Bean在二级缓存中已经存在代理对象,则直接使用代理对象进行注入。
-
初始化Bean:如果Bean实现了InitializingBean接口或者定义了init-method方法,容器会调用相应的方法对Bean进行初始化。初始化后的Bean将保存在三级缓存中。
-
返回Bean:最后,容器会从三级缓存中获取最终的Bean实例,返回给用户使用。
通过引入三级缓存,Spring框架能够在多线程环境下快速创建Bean实例并解决循环依赖的问题,提高了容器的性能和并发能力。
1年前 -