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实例包裹一层,增加相关操作。

  

posted @ 2017-03-12 22:32  BobZhang  阅读(20173)  评论(2编辑  收藏  举报
Helloworld