一、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實例包裹一層,增加相關操作。