一、概述
SpringCache
本身是一个缓存体系的抽象实现,并没有具体的缓存能力,要使用SpringCache
还需要配合具体的缓存实现来完成。
虽然如此,但是SpringCache是所有Spring支持的缓存结构的基础
,而且所有的缓存的使用最后都要归结于SpringCache。
二、缓存注解
SpringCache缓存功能的实现是依靠下面的这几个注解完成的。
- @EnableCaching:开启缓存功能
- @Cacheable:定义缓存,用于触发缓存
- @CachePut:定义更新缓存,触发缓存更新
- @CacheEvict:定义清除缓存,触发缓存清除
- @Caching:组合定义多种缓存功能
- @CacheConfig:定义公共设置,位于
class
之上
1、@CacheConfig
该注解标注于类
之上,用于配置该类中会用到的一些公共的缓存
相关配置。
@CacheConfig(cacheNames = “pers.liuchengyin.service.blogServiceImpl”)
cachNames
的值pers.liuchengyin.service.blogServiceImpl
就是这个类公共的缓存对象
,就相当于一个名为pers.liuchengyin.service.blogServiceImpl
的Map
对象,下文简称对象
2、@Cacheable
用在查询的方法
上,方法的返回值将被加入缓存
。该注解标注的方法每次被调用前都会触发缓存校验
,校验指定参数的缓存
是否已存在(已发生过相同参数的调用),若存在,直接返回缓存结果,否则执行方法内容,最后将方法执行结果保存到缓存中。
该注解有这些参数:value
、cacheNames
、key
、condition
、unless
、keyGenerator
、cacheManager
、cacheResolver
①value
、cacheNames
是两个同等的参数。cacheNames是Spring4新增的,作为value
的别名,用于指定缓存对象
,不是必须指定的。如果不指定则使用类
上面配置的CacheConfig
配置的cacheNames
。
②key
就是缓存对象存储在Map
集合中的key
值,不是必需,缺省
按照方法的所有参数
组合作 为key
值, 可以自己配置,但需要SpEL
表达式。比如
@Cacheable(key = "#p0") // 表示第一个参数作为缓存的key值
getBlog(Integer id, String name){}
@Cacheable(key = "#id") // 也可以用参数名作为缓存的key值,这里的参数是id
getBlog(Integer id, String name){}
@Cacheable(key = "#user.id") // 甚至可以用对象里的某个属性作为key值
getBlog(Integer id, User user){}
③condition
缓存对象的条件,非必需,也需使用SpEL
表达式,只有满足表达式条件的内容才会被缓存。比如
@Cacheable(key = "#p0",condition = "#username.lenth < 3")
getBlog(Integer id, String username){} // 只有第二个参数长度小于3的时候才缓存进去
④unless
与condition
相似,但unless
是方法被调用之后才做判断的,所以可以对结果result
进行判断是否去缓存。
⑤keyGenerator
用于指定key 生成器
,非必需。
若需要指定一个自定义的key生成器,我们需要去实现 org.springframework.cache.interceptor.KeyGenerator
接口,并使用该参数来指定
⑥cacheManager
用于指定使用哪个缓存管理器
,非必需。只有当有多个缓存管理器时才需要使用。
⑦cacheResolver
用于指定使用那个缓存解析器
,非必需。需通过 org.springframework.cache.interceptor.CacheResolver
接口来实现自己的缓存解析器,并用该参数指定。
3、@CachePut
用于更新缓存
,无论结果
是否已经缓存,都会在方法执行结束插入缓存,相当于更新缓存,一般用于更新方法
和新增方法
之上。其参数与@Cacheable
类似。
4、@CacheEvict
配置于方法上,通常用在删除
方法上,用来从缓存中移除相应数据。 除了同@Cacheable
一样的参数之外,它还有下面两个参数:
①allEntries
,非必需,默认为false
。当为true
时,会移除对应缓存对象的所有缓存数据,也就是移除cacheName
或value
指定的对象的缓存数据。
②beforeInvocation
,非必需, 默认为false
,会在调用方法之后
移除数据。 当为 true
时,会在调用方法之前
移除数据。
5、总结
一般来说,我们都在Service
实现层的类上面使用@CacheConfig
来指定公共缓存配置,在查询
的方法上使用@Cacheable
,在新增/修改
的方法上使用@CachePut
,在删除
的方法上使用@CacheEvict
。