Spring全家桶中@CacheEvict无效情况共有以下几种
- 一、背景介绍
- 二、原因分析
- 三、解决方案
一、背景介绍
SpringBoot中使用@Cacheable注解缓存数据,使用@CacheEvict注解删除缓存。但是在项目使用过程中,发现使用@CacheEvict注解删除缓存无效。
拓展:@CacheEvict 就是一个触发器,在每次调用被它注解的方法时,就会触发删除它指定的缓存的动作。跟 @Cacheable 和 @CachePut 一样,@CacheEvict 也要求指定一个或多个缓存,也指定自定义的缓存解析器和 key 生成器,也支持指定条件(condition 参数)。
@CacheEvict 是用来清除缓存的,有以下属性:
value:缓存位置名称,不能为空。
key:缓存的key,默认为空。
condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL。
allEntries:true表示清除value中的全部缓存,默认为false。
二、原因分析
经过网络搜索与总结,Spring全家桶中@CacheEvict无效的原因有以下几种情况:
- 1、使用@CacheEvict注解的方法必须是Controller层直接调用,Service里间接调用不生效。(我本次出现无效的原因)
- 2、key值跟你查询方法的key值不统一,所以导致缓存并没有清除。
- 3、把@CacheEvict的方法和@Cacheable的方法放到一个java文件中写,如果这两个注解在两个java文件的话,会导致@CacheEvict失效。
- 4、返回值必须设置为void才会生效。网络上有很多同学有返回值的使用@CacheEvict这个注解也是无效的。
@CacheEvict annotation
It is important to note that void methods can be used with @CacheEvict
- 5、@CacheEvict必须作用在走代理的方法上。同原因1。
在使用Spring @CacheEvict注解的时候,要注意,如果类A的方法function1()被标注了 @CacheEvict注解,那么当类A的其他方法,例如:function2(),去直接调用function1()的时候, @CacheEvict是不起作用的,原因是 @CacheEvict是基于Spring AOP代理类,function2()属于内部方法,直接调用function1()时,是不走代理的。
@CacheEvict不生效的代码示例如下:
三、解决方案
知道原因之后,就知道怎么解决了,由于以上有几种原因,针对每种原因的解决方案不同,各自对应解决即可。
以下为本文中出现问题的解决方案
本文完结!