1. Spring框架中的三级缓存是什么?
Spring框架中的三级缓存是指在Spring的Bean生命周期中,用于管理单例Bean创建过程中的缓存机制。
它是在Spring的DefaultSingletonBeanRegistry类中实现的。
2. 解决了什么问题
三级缓存主要用于解决循环依赖的问题,即当两个或多个Bean之间存在相互依赖关系时,Spring需要在实例化这些Bean时进行特殊处理,以确保它们能够正确地相互引用。
3. 下面是三级缓存的工作过程:
第一级缓存:singletonObjects
在Bean实例化的过程中,首先会尝试从第一级缓存中获取Bean实例。如果能够找到对应的实例,则直接返回,不再进行后续的实例化过程。
第二级缓存:earlySingletonObjects
如果第一级缓存中没有找到Bean实例,Spring会尝试从第二级缓存中获取Bean实例。第二级缓存用于存储正在创建中的Bean实例,这些实例已经经过了实例化、属性填充等处理的步骤。
如果能够找到对应的实例,则将其提前暴露给其他正在创建中的Bean,以解决循环依赖问题。
第三级缓存:singletonFactories
如果第二级缓存中也没有找到Bean实例,Spring会尝试从第三级缓存中获取Bean实例的创建工厂对象(ObjectFactory)。
创建工厂对象是在Bean实例化的过程中,通过调用Bean的无参构造方法来创建一个原始的Bean实例,并对其进行初始化(填充属性等)。
创建工厂对象的目的是为了在获取Bean实例后,将其放入第二级缓存中,并提前暴露给其他正在创建中的Bean。
通过这三级缓存的机制,Spring能够解决循环依赖的问题,并确保在Bean的创建过程中,能够正确地处理相互依赖关系。但需要注意的是,过度的循环依赖会增加系统的复杂性,因此在设计应用程序时,应尽量避免过多的循环依赖关系。
4. 源码中的方法位置: org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)
5. 三级缓存在源码中是(就是三个map):
image.png image.png白话解释:
一级缓存是用于存放已经被初始化好的Bean,这些Bean已经是成品可以被使用。
二级缓存是用于存放半成品的Bean,存放在二级缓存中的是注入对象的代理,每次获取创建中的对象先从二级缓存中查询是因为这样就可以拿到代理对象,而不用每次都包装代理返回提高执行性能
三级缓存是用于存放原始的注入对象,这些对象还是简单对象并没有被代理,三级缓存是用于解决循环依赖问题,当对象A依赖对象B时,A对象就会被先临时存放在三级缓存中,然后初始化B对象。在这个时间点如果有别的注入对象需要依赖A对象就会从三级缓存中查询,并通过三级缓存的getObject方法生成代理对象然后将A对象从三级缓存中删除,放入二级缓存。
-End-
网友评论