环境搭建
依赖
1 | <dependency> |
controller
1 |
|
service
1 |
|
mapper
1 |
|
使用默认的cache(ConcurrentMapCache)
在启动类中添加@EnableCaching注解开启缓存
使用@Cacheable, @CacheEvict,@CachePut,@Caching等注解
@Cacheable
1 |
|
运行流程(@Cacheable):
1、方法运行前,先去查询Cache(缓存组件),CacheManager按照CacheName查找一下是否存在这个Cache,有的话就返回这个Cache,没有的话就创建一个createConcurrentMapCache.
2.根据key去Cache中查找。其中key是按照某种策略(keyGenerator)生成的,默认是方法的参数。
ConcurrentMapCacheManager
1 | public class ConcurrentMapCacheManager implements CacheManager, BeanClassLoaderAware { |
keyGenerator
1 | protected Object generateKey(@Nullable Object result) { |
SimpleKeyGenerator
1 | public static Object generateKey(Object... params) { |
- 如果有没有参数的话:key=SimpleKey.EMPTY,即SimpleKey.new SimpleKey() 结果:SimpleKey[]
- 如果有一个参数的话:key = 参数的值
- 如果有多个参数的话:key = new SimpleKey(params) 结果:SimpleKey[param1,param2]
3.没有查到缓存的话就调用目标方法
4.将方法的返回值存入到缓存中。
@CachePut
1 | //result:返回值,@Cacheable中是不能用result的,因为在@Cacheable中key是在执行方法前就创建了。 |
运行流程
1.先根据CacheName查找是否存在缓存,没有的话就创建一个,然后返回
2.执行方法
3.生成key,然后将返回值存入到缓存中
@CacheEvict
1 | //allEntries:是否删除全部(相同cacheNames) |
运行流程
1.先根据CacheName查找是否存在缓存,没有的话就创建一个,然后返回
2.如果是beforeInvocation为true的话,就直接在缓存中删除,如果为false的话,就先执行方法,然后再删除缓存。
@Caching
1 | (cacheNames = "userList") |
有时候我们既要更新,又要删除缓存的时候,比如增加了一条数据后,需要将它加入到缓存中,并且将之前的list缓存删除,此时就可以使用Caching注解。
源码分析
当开启了@EnableCaching注解后,springboot会自动装配CacheAutoConfiguration这个配置类。
1 |
|
这里有个ImportSelector,会获取缓存配置类的全类名,然后会根据全类名将配置类加入到ioc容器中。
其中默认生效的是SimpleCacheConfiguration(在配置文件中加入debug: true,就可以看到自动装配了哪些类)
SimpleCacheConfiguration
1 |
|
其中注入了一个ConcurrentMapCacheManager
ConcurrentMapCacheManager
1 | public class ConcurrentMapCacheManager implements CacheManager, BeanClassLoaderAware { |
createConcurrentMapCache方法返回的是一个ConcurrentMapCache,这就是保存缓存数据的map
1 | protected Cache createConcurrentMapCache(String name) { |
1 | public class ConcurrentMapCache extends AbstractValueAdaptingCache{ |
ConcurrentMapCache
1 | public class ConcurrentMapCache extends AbstractValueAdaptingCache { |
总结
首先,要使用缓存,就需要加入spring-boot-starter-cache这个启动器,并且使用@EnableCaching注解来开启缓存(注入必要的组件),而且默认是使用的SimpleCacheConfiguration这个配置类,其中会注册ConcurrentMapCacheManager这个CacheManager来管理缓存,ConcurrentMapCache就是默认的缓存容器。