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例項化之後呼叫。這裡使用了
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例項包裹一層,增加相關操作。