spring三级缓存主要是哪些
-
Spring的三级缓存是用于存储Bean对象的缓存机制,用于提高Bean的创建效率和性能。它由一级缓存、二级缓存和三级缓存组成。
一级缓存是指Bean对象在创建过程中的缓存,也称为对象工厂缓存。在初始化一个Bean对象时,Spring会通过对象工厂创建一个新的Bean实例,然后将其缓存起来。当下次需要获取该Bean时,如果一级缓存中存在该Bean的实例,则直接返回缓存的实例。一级缓存使用的数据结构是一个ConcurrentHashMap,通过Bean的名称作为键来缓存对应的实例。
二级缓存是指Bean对象创建过程中的缓存,也称为单例池缓存。当一级缓存中不存在需要的Bean实例时,Spring会检查二级缓存是否存在该Bean的实例。如果存在,则将实例从二级缓存中移除,放入一级缓存,并返回该实例。二级缓存使用的数据结构是一个ConcurrentHashMap,通过Bean的名称作为键来缓存对应的实例。
三级缓存是指Bean对象创建过程中的缓存,也称为原型缓存。当一级缓存和二级缓存中都不存在需要的Bean实例时,Spring会检查三级缓存是否存在该Bean的ObjectFactory(原型Bean工厂)。如果存在,则使用ObjectFactory创建一个新的Bean实例,并将其放入二级缓存,并返回该实例。三级缓存使用的数据结构是一个ConcurrentHashMap,通过Bean的名称作为键来缓存对应的ObjectFactory。
需要注意的是,三级缓存只在使用原型作用域(@Scope("prototype"))的Bean时才会被使用。对于使用其他作用域(如单例作用域)的Bean,Spring不会使用三级缓存。
总结起来,Spring的三级缓存由一级缓存、二级缓存和三级缓存组成,分别用于存储Bean对象的实例。它们的作用是提高Bean的创建效率和性能。一级缓存和二级缓存都是使用ConcurrentHashMap进行存储,根据Bean的名称作为键来获取对应的实例。三级缓存则是使用ConcurrentHashMap存储ObjectFactory,用于创建原型Bean的实例。
1年前 -
Spring框架中的三级缓存是指BeanFactory中的beanDefinitionMap、beanDefinitionNames和singletonObjects这三个缓存结构。这三个级别的缓存分别用于不同的目的和场景。
-
beanDefinitionMap缓存:
beanDefinitionMap是一个用于缓存BeanDefinition的HashMap结构。每个BeanDefinition对象都代表一个bean的定义,包含了bean的名称、作用域、类型、属性等信息。这个缓存结构通过bean的名称来索引BeanDefinition对象,当需要获取或创建一个bean时,首先根据名称从这个缓存中查找对应的BeanDefinition对象,如果找到就可以根据该对象的信息进行后续的操作,例如创建bean的实例。 -
beanDefinitionNames缓存:
beanDefinitionNames是一个保存了所有bean名称的数组。这个缓存结构用于快速获取所有可用的bean名称,对于一些需要遍历所有bean的场景,如AOP代理等,可以直接从这个缓存中获取所有bean的名称,避免了每次都要去遍历beanDefinitionMap的开销。 -
singletonObjects缓存:
singletonObjects是一个缓存已创建的单例bean实例的HashMap结构。在Spring容器中,单例bean是默认的作用域,每个bean都有一个唯一的实例作为其代表。当容器需要获取一个单例bean的实例时,首先会检查这个缓存中是否存在该bean的实例,如果存在就返回缓存中的实例,否则就根据对应的BeanDefinition对象创建一个新的实例,并将其放入缓存中。这样做的好处是,能够提高获取单例bean实例的效率,避免重复创建实例的开销。
通过以上三个级别的缓存,Spring框架能够更高效地管理和创建bean实例。在容器启动时,Spring会解析bean的定义并将其放入beanDefinitionMap和beanDefinitionNames缓存中,在需要获取bean的实例时,首先会检查singletonObjects缓存,如果存在则直接返回缓存中的实例,否则根据bean的定义创建新的实例,并将其放入缓存中。这样可以大大减少重复创建实例的开销,提高应用程序的性能。
1年前 -
-
Spring中的三级缓存是指在创建和获取Bean对象时,Spring容器使用的缓存机制。这三级缓存分别是singletonObjects、earlySingletonObjects和singletonFactories。
-
singletonObjects: 这是Spring容器用来缓存已创建的单例Bean对象的缓存。当一个Bean对象被创建后,会被放入singletonObjects缓存中。当再次请求获取该Bean对象时,容器会直接从该缓存中返回已创建好的对象。
-
earlySingletonObjects: 这个缓存用来缓存被提前曝光的早期单例Bean对象,主要用于解决循环依赖的问题。当Spring容器创建一个Bean对象时,如果发现该对象依赖其他Bean对象,而这些依赖对象又依赖该对象,就会发生循环依赖。为了解决这个问题,Spring会提前将正在创建的Bean对象暴露给其他Bean对象,使得循环依赖能够得到解决,被提前曝光的早期单例Bean对象会被缓存到earlySingletonObjects中,待依赖注入完成后,会将其从该缓存中移除。
-
singletonFactories: 这个缓存用来缓存用于创建单例Bean对象的ObjectFactory。当一个Bean对象正在被创建时,Spring容器会将用于创建该对象的工厂对象缓存到singletonFactories中。这样,在对象完成创建之前,如果发现有其他对象依赖于该对象时,容器可以通过工厂对象来创建该对象的副本,避免了循环依赖。
Spring使用这三级缓存机制,能够解决循环依赖问题,并提高Bean对象的创建性能。同时,这三级缓存也帮助Spring容器实现了单例Bean对象的复用,减少对象创建的开销。但需要注意的是,这些缓存机制都是基于HashMap实现的,因此需要考虑线程安全问题。在多线程环境下,可能会导致对象创建的竞争和不一致性问题,所以Spring容器对三级缓存的操作都需要进行同步处理。
1年前 -