Spring缓存源码剖析:(二)CacheManager
一、CacheManager总览
如果需要Spring缓存可以正常工作,必须配置一个CacheManager。
CacheManager实现类你可以配置Spring-context本身提供的SimpleCacheManager和ConcurrentMapCacheManager等。或者使用RedisCacheManager将缓存内容存放到Redis中。下面类图中RedisCacheManager来自于spring-data-redis jar包中,AbstractTransactionSupportingCacheManager来自Spring-context-support jar包中。本系列文章主要关注spring-context jar包。
二、CacheManager接口
CacheManager简单描述就是用来存放Cache,Cache用于存放具体的key-value值。举个栗子:一个Cache的名字是“奶牛厂”,那么这个Cache中可以根据“小白”获得叫做小白的奶牛,“小黑”获得叫做小黑点奶牛。
三、AbstractCacheManager抽象类
AbstractCacheManager提供了基本的操作,如果已经存在的CacheManager无法满足使用要求,可以继承AbstractCacheManager类实现自己的CacheManager。
afterPropertiesSet()方法。来自实现的org.springframework.beans.factory.InitializingBean接口,在Bean实例化之后调用。这里使用了模板方法模式,loadCaches()方法的实现交给具体的子类,大致意思就是:这里需要得到Cache的集合,具体这个Cache集合从哪里来,具体的Cache的实现类是什么一概不管。
getCache(String)方法。即根据Cache名称获取与之对应的Cache,如果没有找到对应的Cache,则会调用getMissingCache(String),默认getMissingCache返回null。将决定权交给实现者,你可以创建一个Cache,或者记录日志。
updateCacheNames(String)方法。如果getMissingCache后cache不为空,这里会调用updateCacheNames方法,更新cacheNames集合。cacheNames是一个只读的Set,每次更新需要重新创建新的Set。
lookupCache(String) 方法。根据一个Cache名称得到对应的Cache,如果没有就返回null,不会触发getMissingCache方法。
decorateCache(Cache)方法。加入getMissingCache方法创建了Cache的实例,则会调用decorateCache方法对原有的Cache进行一次包装,这个通过方法名字应该可以猜到可能会用到修饰模式(也有叫装饰模式等),这里也没有给出具体实现。
我们来看一个实现该方法的例子,就拿RedisCacheManager来看:
在RedisCacheManager中decorateCache方法直接调用父类AbstractTransactionSupportingCacheManager中的decorateCache方法,如果条件是“可感知事务的”,则会用事务的Cache修饰器类将原有的Cache实例包裹一层,增加相关操作。