原理
1.自動配置類;CacheAutoConfiguration
在idea中使用快捷鍵ctrl+shift+n,查找出CacheAutoConfiguration類
看到import中有導入CacheConfigurationImportSelector類,我們通過對這個類進行debug查看過程中我們導入哪些選擇器。
可以看到返回如下的配置
2.緩存的配置類
org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration
org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration
org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration
3.哪個配置生效
在application的配置文件中,添加如下語句
#控制檯打印配置信息
debug=true
可以看到哪些配置項生效
分析下SimpleCacheConfiguration
4.給容器中註冊了CacheManger:ConcurrentMapCacheManager
5.可以獲取和創建ConcurrentMapCache類型的緩存組件,它的作用是將數據保存在ConcurrentMap中;
運行的流程
@Cacheable
- 方法運行之前,先去查詢cache(緩存組件),按照cacheName指定的名字獲取;(cacheManager先獲取相應的緩存),第一次獲取如果沒有Cache組件會自動創建。
- 去cache中查找緩存的內容,使用一個key,默認是方法的參數;key是按照某種策略生成的,默認是使用keyGenerator生成的,默認使用SimpleKeyGenerator生成key;SimpleKeyGenerator生成可以的莫仍策略;如果沒有參數;key=new SimpleKey();如果有一個參數:key=參數的值;如果有多個參數:key = new Simplekey(params);
- 沒有查到緩存就調用目標方法;
- 將目標方法返回的結果。放進緩存中;
@Cacheable標註的方法執行之前先來檢查緩存中有沒有這個數據,默認按照參數的值作爲key去查詢緩存,如果沒有就運行方法並將結果放入緩存。以後再來調用就可以直接使用緩存中的數據。
核心:
1)使用cacheManager【ConcurrentMapCacheManager】按照名字得到【ConcurrentMapCache】組件
2)key使用keyGenerator生成的,默認是simpleKeyGenerator