spring三层缓存存的是什么
-
Spring的三层缓存分别是BeanFactory缓存、单例对象缓存和早期对象工厂缓存。
-
BeanFactory缓存:在Spring容器启动时,Spring会将Bean定义的元数据信息解析后存储在BeanFactory缓存中。它保存了所有的Bean定义以及Bean的创建和依赖关系。
-
单例对象缓存:在Spring容器启动时,会将所有作用域为Singleton的Bean创建并放入单例对象缓存中。当需要获取这些Bean时,Spring会直接从缓存中返回已经创建好的实例。
-
早期对象工厂缓存:在Bean的创建过程中,Spring会将正在创建但未完全实例化的Bean对象放入早期对象工厂缓存。这是为了解决循环依赖的问题,即当一个Bean的创建依赖另一个Bean时,Spring会提前暴露尚未完全实例化的Bean,以便其他Bean可以引用它。
总结:Spring的三层缓存分别存储了Bean的元数据、已创建的单例对象和早期对象工厂。它们在Spring容器的启动和Bean的创建过程中起到了不同的作用,提高了系统的性能和效率。
1年前 -
-
Spring中的三层缓存指的是Bean的缓存,包括singletonObjects、earlySingletonObjects和singletonFactories。
-
singletonObjects:这是最常见的缓存层,用于存储已经实例化的单例Bean对象。当我们使用getBean()方法获取一个单例Bean时,如果该Bean在singletonObjects缓存中已经存在,则直接返回该对象;如果不存在,则通过实例化Bean工厂创建新的对象,并存储在该缓存中。
-
earlySingletonObjects:这是一个提前实例化的缓存层,用于存储已经实例化但未完成初始化的单例Bean对象。当通过getBean()方法获取一个Bean时,如果该Bean在singletonObjects缓存中不存在,但在earlySingletonObjects缓存中存在,则说明该Bean正在初始化过程中,此时会从earlySingletonObjects缓存中获取该对象。
-
singletonFactories:这是一个用于存储创建单例Bean对象的工厂方法的缓存层。在Spring容器启动时,如果配置了一些lazy-init的单例Bean,在容器启动时不会进行实例化,而是将创建Bean对象的工厂方法存储在singletonFactories缓存中。当我们通过getBean()方法获取这些Bean时,会使用该缓存中的工厂方法来创建Bean对象。
这三层缓存在Spring中的目的是提高Bean的获取效率,当我们反复请求一个Bean时,可以直接从缓存中获取,而不必每次都去创建新的对象。同时,三层缓存也能保证Bean的实例唯一性,即在同一个容器中,同一类型的Bean只被实例化一次。这在单例模式中尤为重要,保证了Bean的唯一性和线程安全性。
1年前 -
-
Spring框架的三层缓存是指在Spring的应用上下文中,Spring框架使用三层缓存来缓存Bean的定义信息和Bean的实例。
第一层缓存是单例对象缓存。在Spring应用上下文启动时,Spring会创建所有的单例Bean,并将其缓存起来。当需要获取一个单例Bean时,Spring首先会从第一层缓存中查找,如果找到直接返回,如果没有找到,则继续下一步操作。
第二层缓存是早期对Bean的纯粹包装类的缓存。在第一次创建单例Bean时,会将Bean的ObjectFactory封装成BeanWrapper对象,并缓存起来。当需要获取一个单例Bean时,Spring会从第二层缓存中获取BeanWrapper对象,然后调用其getObject方法获取实际的Bean对象。
第三层缓存是存放原始的Bean定义信息的缓存。在创建Bean的过程中,Spring会解析并缓存Bean的原始定义信息,包括Bean的Class对象、Bean的属性、构造函数等信息。当需要获取一个单例Bean时,如果前两层缓存都没有找到,Spring会使用第三层缓存中的原始定义信息来创建Bean实例,并将其缓存起来。
通过使用三层缓存,Spring可以提高Bean的创建和获取性能。在应用启动时,将所有的单例Bean都创建并缓存起来,避免了每次获取Bean时都需要进行创建的开销。同时,Spring还提供了一些方法来支持动态地刷新缓存,以便在启动时或者运行时动态地添加、修改或删除Bean。
总结来说,Spring的三层缓存存储的是单例Bean的定义信息和实例。第一层缓存是存放单例Bean实例的缓存,第二层缓存是存放包装Bean的缓存,第三层缓存是存放Bean的定义信息的缓存。这三层缓存的使用可以提高Spring应用的性能和效率。
1年前