1. 程式人生 > >Spring快取原始碼剖析:(二)CacheManager

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