使用spring cache 时,需开启缓存注解
使用缓存,还需要配置cacheManager
cacheManager有很多实现类,对应不同的缓存框架
spring cache 提供了几个注解,用于设置缓存
-
@Cacheable
该注解会将方法的返回值进行缓存,下次调用该方法,会取缓存中数据
该注解可以放在类名上,也可以放在方法上
value:指定CacheName,
cacheNames:等同于value
key:指定缓存key
keyGenerator:指定缓存key生成策略
cacheManager:指定缓存管理器
cacheResolver:执行缓存解析器
condition:指定缓存生效条件
unless:指定缓存不生效条件
sync:没有缓存,执行方法时,是否单线程执行 -
@CacheEvict
缓存删除
value:指定CacheName,
cacheNames:等同于value
key:指定缓存key
keyGenerator:指定缓存key生成策略
cacheManager:指定缓存管理器
cacheResolver:执行缓存解析器
condition:指定缓存失效条件
allEntries:是否移除cache中所有缓存
beforeInvocation:是否方法执行前移除缓存 -
@CachePut
该注解只会缓存数据,调用方法时,不经过缓存
value:指定CacheName,
cacheNames:等同于value
key:指定缓存key
keyGenerator:指定缓存key生成策略
cacheManager:指定缓存管理器
cacheResolver:执行缓存解析器
condition:指定缓存生效条件
unless:指定缓存不生效条件 -
@Caching
复合注解,包含多个
-
@CacheConfig
配置缓存信息,配置在类上,对方法生效
- 注入bean
@EnableCaching注解引入了一个配置类CachingConfigurationSelector
启动时,会调用该类的selectImports方法,根据配置的代理模式进行选择
proxy模式中,会引入配置类ProxyCachingConfiguration、AutoProxyRegistrar
AutoProxyRegistrar会注入InfrastructureAdvisorAutoProxyCreator,实现了beanPostProcessor接口,
对bean拦截增强
ProxyCachingConfiguration会创建BeanFactoryCacheOperationSourceAdvisor、CacheOperationSource、CacheInterceptor
CacheInterceptor用于方法拦截,查找缓存信息
CacheOperationSource包含SpringCacheAnnotationParser类,用于扫描 @Cacheable, @CachePut @CacheEvict 注解的类、方法,默认只扫public方法
BeanFactoryCacheOperationSourceAdvisor是缓存通知,bean的后置处理时,会进行调用,判断bean中是否存在缓存注解,进行代理增强
2. 后置处理扫描注解
找到advisor,并进行筛选
匹配方法中的注解
先查找缓存里,是不是已经存在,不存在则进入computeCacheOperations
先查找方法上的注解,没找到则查找class上的注解,
匹配后,创建代理对象
3 . 方法调用
进入拦截器,调用方法
查找方法对应的CacheOperation,执行
beforeInvocation==true ,则处理CacheEvictOperation
查找缓存是否存在,如果缓存不存在,则收集需要缓存的request放入cachePutRequests
如果缓存存在,则调用缓存。
如果缓存不存在,则调用原方法处理,
如果有CachePutOperation注解,调用collectPutRequests,收集需要缓存的request放入cachePutRequests,
遍历cachePutRequests,进行缓存
如果有CacheEvictOperation注解,进行缓存删除



