spring的三级缓存的map是什么结构的
时间: 2023-06-18 13:08:00 浏览: 51
Spring的三级缓存中,第二级缓存是通过一个ConcurrentMap来实现的,而第三级缓存是通过一个ConcurrentHashMap来实现的。这两个Map都是线程安全的。
其中,第二级缓存的ConcurrentMap是在每个缓存的BeanFactory中维护的,用于缓存已经解析好的BeanDefinition对象。而第三级缓存的ConcurrentHashMap是在整个Spring容器中共享的,用于缓存已经实例化好的Bean对象。
值得注意的是,第三级缓存的ConcurrentHashMap并不是在Spring的BeanFactory中维护的,而是在AbstractApplicationContext中维护的。这意味着,如果一个BeanFactory被多个ApplicationContext共享,那么它们将共享同一个第三级缓存。
相关问题
spring 三级缓存 详细过程
Spring的三级缓存指的是BeanFactory的三级缓存。它的详细过程如下:
1. Spring在初始化BeanFactory时,会先创建一个名为singletonObjects的ConcurrentHashMap对象,用于存储已经创建的单例Bean对象。
2. 在BeanFactory中,Spring会维护一个名为earlySingletonObjects的ConcurrentHashMap对象,用于存储创建中的Bean对象。这个Map中存储的是已经经过实例化但还未完成属性填充和初始化的Bean对象。
3. 在BeanFactory中,Spring还维护了一个名为singletonFactories的ConcurrentHashMap对象,用于存储Bean的创建工厂对象。这个Map中存储的是Bean创建过程中所使用的创建工厂对象,即BeanDefinition对象,而不是真正的Bean实例。
当一个Bean被请求时,Spring会按照如下顺序尝试从缓存中获取Bean:
1. 首先,Spring会尝试从singletonObjects中获取Bean对象。如果能够获取到Bean对象,则直接返回。
2. 如果singletonObjects中不存在Bean对象,则Spring会尝试从earlySingletonObjects中获取Bean对象。
- 如果能够获取到Bean对象,则将其移动到singletonObjects中,并返回该对象。
- 如果earlySingletonObjects中也不存在Bean对象,则进入下一步。
3. 最后,Spring会尝试从singletonFactories中获取Bean创建工厂对象。如果存在Bean创建工厂对象,则Spring会使用该对象完成Bean的创建,并将创建的Bean对象存储到singletonObjects和earlySingletonObjects中。
- 如果singletonFactories中也不存在Bean创建工厂对象,则进入下一步。
4. 如果以上三个缓存中都无法获取到Bean对象,则Spring会按照正常的Bean创建流程来创建该Bean对象。
在Bean实例化和初始化完成后,该Bean对象会被存储到singletonObjects中,并从earlySingletonObjects中移除。这样,下次请求该Bean时,就可以直接从singletonObjects中获取到Bean对象了。
spring循环依赖三级缓存面试
Spring循环依赖的解决方式是使用三级缓存。当两个Bean相互依赖时,Spring会将其中一个Bean提前暴露出来,然后将其放入三级缓存中。当另一个Bean需要依赖这个Bean时,Spring会从三级缓存中获取已经提前暴露出来的Bean,然后完成依赖注入。
三级缓存的具体实现是通过三个Map来实现的,分别是singletonObjects、earlySingletonObjects和singletonFactories。其中singletonObjects用于存放完全初始化好的单例Bean,earlySingletonObjects用于存放提前暴露出来但还未完全初始化的单例Bean,singletonFactories用于存放创建单例Bean的工厂方法。
在循环依赖的情况下,当一个Bean被创建时,Spring会将其放入singletonFactories中,并将其提前暴露出来放入earlySingletonObjects中。当另一个Bean需要依赖这个Bean时,Spring会从earlySingletonObjects中获取这个Bean,并将其放入singletonObjects中。然后再完成另一个Bean的创建和初始化。