一、背景介绍
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不生效的代码示例如下:

三、解决方案
知道原因之后,就知道怎么解决了,由于以上有几种原因,针对每种原因的解决方案不同,各自对应解决即可。
以下为本文中出现问题的解决方案

到此这篇关于spring全家桶中@cacheevict无效情况的问题解决的文章就介绍到这了,更多相关spring @cacheevict无效情况内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论