spring 三级缓存
Spring三级缓存是Spring框架用来解决循环依赖问题的一种机制,它包含三级缓存:singletonObjects、earlySingletonObjects和singletonFactories。
- singletonObjects缓存:用来存放已经完全初始化的单例Bean实例,也就是最终被返回的单例Bean实例。在缓存中,Bean的名字和Bean实例是以键值对的形式存在的。
- earlySingletonObjects缓存:用来存放已经创建,但还未完成初始化的单例Bean实例。这些Bean实例通常是因为依赖其他Bean实例而无法完成初始化,处于不完整状态。
- singletonFactories缓存:用来存放Bean实例的工厂对象,这些工厂对象可以用来创建单例Bean实例。当Bean实例处于循环依赖关系时,Spring框架会先创建一个用于创建Bean实例的工厂对象,放到singletonFactories缓存中。
三级缓存的实现原理如下:
- 当Spring容器创建Bean时,首先会从singletonObjects缓存中查找Bean实例,如果能找到则直接返回。
- 如果在singletonObjects缓存中没有找到Bean实例,则从earlySingletonObjects缓存中查找,如果找到了一个未完成初始化的Bean实例,则将其返回,并在后续的处理中完成初始化。
- 如果在earlySingletonObjects缓存中也没有找到Bean实例,则从singletonFactories缓存中查找是否存在创建Bean实例的工厂对象,如果存在,则通过工厂对象创建一个新的Bean实例,并将工厂对象从singletonFactories缓存中移除。
- 如果在singletonFactories缓存中也没有找到工厂对象,则需要创建一个新的工厂对象,并放到singletonFactories缓存中,以便后续使用。
- 创建Bean实例时,如果Bean存在循环依赖,那么Spring框架会先创建一个用于创建Bean实例的工厂对象,放到singletonFactories缓存中。然后通过工厂对象创建一个新的Bean实例,并将其放到earlySingletonObjects缓存中,以便后续处理。
通过这种方式,Spring框架能够解决循环依赖问题,同时提高了Bean实例的创建效率,避免了重复创建Bean实例的情况。但是,如果应用程序中存在过多的循环依赖,会导致三级缓存占用大量内存,从而影响应用程序的性能和稳定性。因此,在应用程序设计中,应该尽可能避免过多的循环依赖。
来源地址:https://blog.csdn.net/zeng2813/article/details/129267752