spring解决循环依赖为什么要用三级缓存,第三级缓存的作用是什么
时间: 2024-06-05 07:08:11 浏览: 71
针对大厂面试,模仿Spring写的简易版IOC小框架,完美解释三级缓存解决属性注入循环依赖的问题
5星 · 资源好评率100%
在Spring容器中,当两个或多个bean之间存在循环依赖时,容器无法通过简单的依赖注入来解决这个问题。为了解决这个问题,Spring使用了三级缓存。
三级缓存的作用是缓存正在创建的bean实例,以避免循环依赖时出现死循环。它是在BeanFactoryPostProcessor的postProcessBeanFactory方法执行前初始化的。这个缓存分为三级:
1. singletonObjects:单例对象缓存,用于缓存已经创建完成的单例bean实例。
2. earlySingletonObjects:早期单例对象缓存,用于缓存正在创建中的单例bean实例。
3. singletonFactories:单例工厂缓存,用于缓存创建单例bean实例的工厂对象。
当容器创建bean时,首先尝试从singletonObjects缓存中获取bean实例。如果找到了,则直接返回。如果没有找到,则尝试从earlySingletonObjects缓存中获取。如果找到了,则说明当前bean正在创建中,此时需要使用singletonFactories缓存中的工厂对象来完成创建,并返回创建好的bean实例。如果都没找到,则需要创建一个新的bean实例,并将其缓存到earlySingletonObjects中,然后再使用singletonFactories缓存中的工厂对象来创建这个bean实例。
在bean创建完成后,Spring会将其缓存到singletonObjects中。这样,在下次需要获取这个bean时,就可以直接从singletonObjects缓存中获取,而不需要再走一遍缓存流程,从而提高了Spring的性能。
阅读全文