spring三级缓存
时间: 2023-10-28 16:55:05 浏览: 50
Spring框架中的三级缓存是指Bean的缓存机制。在Spring容器中,当我们通过getBean()方法获取一个Bean时,Spring会按照以下流程进行处理:
1. 第一级缓存:单例对象缓存
Spring会首先检查缓存中是否已经存在该Bean的实例。如果存在,则直接返回缓存中的实例,不再创建新的实例。
2. 第二级缓存:早期对象缓存
如果第一级缓存中不存在该Bean的实例,Spring会尝试从早期对象缓存中查找是否有该Bean的实例。早期对象缓存是在Bean创建过程中,还未完全初始化完成之前,在创建过程中可能会创建出一些代理对象或者尚未完全初始化的对象。如果能够找到对应的早期对象,则返回早期对象。
3. 第三级缓存:单例工厂对象缓存
如果第二级缓存中也没有找到对应的实例,Spring会尝试从单例工厂对象缓存中查找是否有该Bean的实例。单例工厂对象缓存是在Bean的创建过程中,如果出现循环依赖的情况,Spring会将正在创建的Bean放入该缓存中。如果能够找到对应的单例工厂对象,则返回该对象。
4. 创建新的Bean实例
如果以上三级缓存都没有找到对应的Bean实例,则Spring会创建一个新的实例,并放入第一级缓存中,以供下次获取时使用。
需要注意的是,这个三级缓存仅适用于单例作用域的Bean,对于其他作用域的Bean,Spring不会进行缓存处理。
相关问题
spring 三级缓存
Spring框架中的三级缓存是指在Bean的创建过程中,Spring容器会维护三个缓存区域来管理Bean的创建和获取过程。
第一级缓存是单例对象的缓存,用于存储已经创建的单例Bean对象。当请求获取一个单例Bean时,Spring会首先检查第一级缓存中是否存在该对象,如果存在则直接返回,否则继续创建。
第二级缓存是早期对象的缓存,用于存储正在创建中的Bean对象。当创建一个单例Bean时,Spring会首先检查第二级缓存中是否存在该对象,如果存在则直接返回,否则继续创建。如果创建过程中发现循环依赖,则会尝试从第一级缓存中获取已经创建的Bean。
第三级缓存是原始对象的缓存,用于存储Bean的原始定义信息。当创建一个单例Bean时,Spring会首先检查第三级缓存中是否存在该对象的原始定义信息,如果存在则使用该信息来创建Bean对象,并将创建好的对象放入第二级缓存中。如果第三级缓存中不存在原始定义信息,则会根据Bean的定义信息来创建对象,并将创建好的对象放入第二级缓存中。
通过使用三级缓存机制,Spring可以有效地管理Bean的创建和获取过程,并且可以解决循环依赖的问题。
Spring 三级缓存
Spring 中的三级缓存指的是 BeanFactory 的三级缓存。这三级缓存分别是 singletonObjects、earlySingletonObjects 和 singletonFactories。
在 Spring 中,BeanFactory 在初始化时,会将所有的 BeanDefinition 存储到一个 ConcurrentHashMap 中,这个 ConcurrentHashMap 存储了 BeanDefinition 的信息,例如 Bean 的名称、类、作用域、依赖等等。
当一个 Bean 被实例化时,Spring 会根据 BeanDefinition 中的信息创建一个 Bean 实例。在创建 Bean 实例时,Spring 会先从 singletonObjects 缓存中查找该 Bean 是否已经被创建,如果已经被创建,则直接返回该 Bean 实例;如果没有被创建,则会从 earlySingletonObjects 缓存中查找,如果存在,则说明该 Bean 正在创建中,直接返回 earlySingletonObjects 中的 Bean 实例;如果既没有在 singletonObjects 中找到,也没有在 earlySingletonObjects 中找到,则会从 singletonFactories 缓存中查找,如果存在,则说明该 Bean 已经被实例化但还没有初始化完成,直接返回 singletonFactories 中的 Bean 实例。
如果在这三级缓存中都没有找到该 Bean 实例,那么 Spring 会创建一个新的 Bean 实例,并将该实例存储到 singletonObjects 缓存中,同时将该实例存储到 earlySingletonObjects 缓存中,表示该 Bean 正在创建中。在 Bean 的初始化完成后,Spring 会将该 Bean 实例从 earlySingletonObjects 缓存中移除,并将该实例存储到 singletonObjects 缓存中。
这样的三级缓存机制可以提高 Spring 中单例 Bean 的创建效率,同时也可以保证单例 Bean 的线程安全。