原理
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