SpringBoot Cache 注解 @Cacheable,@CachePut , @CacheEvict
2018-01-18 00:00
633 查看
SpringBoot Cache 提供了以下注解以方便开发
@CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置。
@Cacheable:主要方法返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。
@CachePut:配置于函数上,能够根据参数定义条件来进行缓存,它与@Cacheable不同的是,它每次都会真是调用函数,所以主要用于数据新增和修改操作上。
@CacheEvict:配置于函数上,通常用在删除方法上,用来从缓存中移除相应数据。
@Caching:配置于函数上,组合多个Cache注解使用。
下面就一个一个的介绍注解:
@CacheConfig是一个类级别的注解。
这样我们在方法上使用如下代码即可,整个代码显得比较干净。
如果忘记了SpEL怎么用了, 请查看:Chapter 9, Spring Expression Language (SpEL):
@CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置。
@Cacheable:主要方法返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。
@CachePut:配置于函数上,能够根据参数定义条件来进行缓存,它与@Cacheable不同的是,它每次都会真是调用函数,所以主要用于数据新增和修改操作上。
@CacheEvict:配置于函数上,通常用在删除方法上,用来从缓存中移除相应数据。
@Caching:配置于函数上,组合多个Cache注解使用。
下面就一个一个的介绍注解:
@Cacheable
@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存作用和配置方法
参数 | 解释 | example |
---|---|---|
value | 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 | 例如: @Cacheable(value=”mycache”) @Cacheable(value={”cache1”,”cache2”} |
key | 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 | @Cacheable(value=”testcache”,key=”#userName”) |
condition | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 | @Cacheable(value=”testcache”,condition=”#userName.length()>2”) |
/** * 根据ID获取Tasklog * @param id * @return */ @Cacheable(value = CACHE_KEY, key = "#id",condition = "#result != null") public Tasklog findById(String id){ System.out.println("FINDBYID"); System.out.println("ID:"+id); return taskLogMapper.selectById(id); }
@CachePut
@CachePut 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用作用和配置方法
参数 | 解释 | example |
---|---|---|
value | 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 | @CachePut(value=”my cache”) |
key | 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 | @CachePut(value=”testcache”,key=”#userName”) |
condition | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 | @CachePut(value=”testcache”,condition=”#userName.length()>2”) |
/** * 添加tasklog * @param tasklog * @return */ @CachePut(value = CACHE_KEY, key = "#tasklog.id") public Tasklog create(Tasklog tasklog){ System.out.println("CREATE"); System.err.println (tasklog); taskLogMapper.insert(tasklog); return tasklog; }
@CacheEvict
@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空作用和配置方法
参数 | 3ff0解释 | example |
---|---|---|
value | 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 | @CacheEvict(value=”my cache”) |
key | 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 | @CacheEvict(value=”testcache”,key=”#userName”) |
condition | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 | @CacheEvict(value=”testcache”,condition=”#userName.length()>2”) |
allEntries | 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 | @CachEvict(value=”testcache”,allEntries=true) |
beforeInvocation | 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 | @CachEvict(value=”testcache”,beforeInvocation=true) |
/** * 根据ID删除Tasklog * @param id */ @CacheEvict(value = CACHE_KEY, key = "#id") public void delete(String id){ System.out.println("DELETE"); System.out.println("ID:"+id); taskLogMapper.deleteById(id); }
@CacheConfig
所有的@Cacheable()里面都有一个value=“xxx”的属性,这显然如果方法多了,写起来也是挺累的,如果可以一次性声明完 那就省事了, 所以,有了@CacheConfig这个配置,@CacheConfig is a class-level annotation that allows to share the cache names,如果你在你的方法写别的名字,那么依然以方法的名字为准。@CacheConfig是一个类级别的注解。
/** * 测试服务层 */ @Service @CacheConfig(value = "taskLog") public class TaskLogService { @Autowired private TaskLogMapper taskLogMapper; @Autowired private net.sf.ehcache.CacheManager cacheManager; /** * 缓存的key */ public static final String CACHE_KEY = "taskLog"; /** * 添加tasklog * @param tasklog * @return */ @CachePut(key = "#tasklog.id") public Tasklog create(Tasklog tasklog){ System.out.println("CREATE"); System.err.println (tasklog); taskLogMapper.insert(tasklog); return tasklog; } /** * 根据ID获取Tasklog * @param id * @return */ @Cacheable(key = "#id") public Tasklog findById(String id){ System.out.println("FINDBYID"); System.out.println("ID:"+id); return taskLogMapper.selectById(id); } }
@Caching
有时候我们可能组合多个Cache注解使用;比如用户新增成功后,我们要添加id–>user;username—>user;email—>user的缓存;此时就需要@Caching组合多个注解标签了。@Caching(put = { @CachePut(value = "user", key = "#user.id"), @CachePut(value = "user", key = "#user.username"), @CachePut(value = "user", key = "#user.email") }) public User save(User user) { }
自定义缓存注解
比如之前的那个@Caching组合,会让方法上的注解显得整个代码比较乱,此时可以使用自定义注解把这些注解组合到一个注解中,如:@Caching(put = { @CachePut(value = "user", key = "#user.id"), @CachePut(value = "user", key = "#user.username"), @CachePut(value = "user", key = "#user.email") }) @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface UserSaveCache { }
这样我们在方法上使用如下代码即可,整个代码显得比较干净。
@UserSaveCache public User save(User user){}
SpEL上下文数据
Spring Cache提供了一些供我们使用的SpEL上下文数据,下表直接摘自Spring官方文档:名称 | 位置 | 描述 | 示例 |
---|---|---|---|
methodName | root对象 | 当前被调用的方法名 | root.methodName |
method | root对象 | 当前被调用的方法 | root.method.name |
target | root对象 | 当前被调用的目标对象 | root.target |
targetClass | root对象 | 当前被调用的目标对象类 | root.targetClass |
args | root对象 | 当前被调用的方法的参数列表 | root.args[0] |
caches | root对象 | 当前方法调用使用的缓存列表(如@Cacheable(value={“cache1”, “cache2”})),则有两个cache | root.caches[0].name |
argument name | 执行上下文 | 当前被调用的方法的参数,如findById(Long id),我们可以通过#id拿到参数 | user.id |
result | 执行上下文 | 方法执行后的返回值(仅当方法执行之后的判断有效,如‘unless’,’cache evict’的beforeInvocation=false) | result |
相关文章推荐
- SpringBoot使用Redis做缓存,@Cacheable、@CachePut、@CacheEvict等注解的使用
- 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
- spring boot 整合 redis,使用@Cacheable,@CacheEvict,@CachePut,jedisPool操作redis数据库
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
- spring整合redis缓存,以注解(@Cacheable、@CachePut、@CacheEvict)形式使用
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
- springboot中关于缓存@Cacheable、@CacheEvict、@CachePut的用法理解浅析
- Spring中缓存注解@Cacheable、@CachePut、@CacheEvict 注释介绍
- Spring缓存注解@Cacheable,@CachePut , @CacheEvict介绍
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
- spring整合redis缓存,以注解(@Cacheable、@CachePut、@CacheEvict)形式使用
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
- spring整合redis缓存,以注解(@Cacheable、@CachePut、@CacheEvict)形式使用
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
- spring整合redis缓存,以注解(@Cacheable、@CachePut、@CacheEvict)形式使用
- Spring 缓存注解(@Cacheable、@CachePut、@CacheEvict)使用
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用