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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM