浏览过一些对spring三级缓存进行说明的文章,都说明了三级缓存的用途:解决循环依赖、支撑动态代理。但是感觉不能令人信服,缺少较详细的说明。
本文将从根本上,对为什么spring要有三级缓存进行探讨,以此来加深各位可亲可敬的程序员的理解。
什么是三级缓存
首先要说清楚,spring是做什么用的。spring最核心的功能,控制反转,依赖注入。名词不解释,本人对名词的理解也有限。白话说,就是内置bean容器,为上层应用提供bean的生命周期管理。
也就是大家要写代码时,例如Java中,写一个@Autowired,就可以完成自动注入,不需要自己去new对象。这有什么好处呢?应用里引入redis的时候,只需要写一个redisTemplate就行了。
这是个人的一点肤浅理解,未必正确,各位看官一听就行。
那么spring如何为代码中使用redisTemplate的地方,注入对应的对象呢?这个地方大家应该都可以想明白,创建一个redisTemplate对象,给所有需要注入的地方使用,也就是单例模式。
这个实现大家都可以想到,用一个集合把对象存起来,最好是使用Map<String,Object>这样一个集合,根据名字搜索时很快。没错,spring就是这样做的(这里我们忽略类型查找)。
在DefaultSingletonBeanRegistry类中有三个变量,是spring bean容器的三级缓存(一二三的顺序先忽略),就是下面代码片段中的三个map变量:
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry { /** Maximum number of suppressed exceptions to preserve. */ private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100; /** Cache of singleton objects: bean name to bean instance. */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); /** Cache of singleton factories: bean name to ObjectFactory. */ private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); /** Cache of e