Spring全家桶中@CacheEvict无效情况的问题解决

 更新时间:2025年10月27日 10:25:04   作者:No8g攻城狮  
本文主要介绍了SpringBoot中@CacheEvict注解删除缓存无效的情况,主要包括Controller直接调用、key值不匹配、方法组织、返回值类型和代理机制,具有一定的参考价值,感兴趣的可以了解一下

一、背景介绍

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无效情况内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea项目打开后出现橙色的时钟图标的解决

    idea项目打开后出现橙色的时钟图标的解决

    本文主要介绍了idea项目打开后出现橙色的时钟图标的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java判读数组中是否有重复值的示例

    java判读数组中是否有重复值的示例

    这篇文章主要介绍了java判读数组中是否有重复值的示例,需要的朋友可以参考下
    2014-04-04
  • 浅谈一下Java中的几种JVM级别的锁

    浅谈一下Java中的几种JVM级别的锁

    这篇文章主要介绍了浅谈一下Java中的几种JVM级别的锁,当存在安全漏洞时,也必须有相应的防护措施。顺应这种趋势,虚拟"锁"被发明出来,以解决线程的安全问题。在这篇文章中,我们将研究多年来出现的 Java 中几种典型的 JVM 级锁,需要的朋友可以参考下
    2023-08-08
  • Java缓存框架之Caffeine源码解析

    Java缓存框架之Caffeine源码解析

    这篇文章主要介绍了Java缓存框架之Caffeine源码解析,Caffeine 是一个基于Java 8的高性能本地缓存框架,其结构和 Guava Cache 基本一样,api也一样,基本上很容易就能替换,需要的朋友可以参考下
    2023-11-11
  • SpringBoot整合rabbitMq自定义消息转换方式

    SpringBoot整合rabbitMq自定义消息转换方式

    这篇文章主要介绍了SpringBoot整合rabbitMq自定义消息转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Mybatis如何自动生成数据库表的实体类

    Mybatis如何自动生成数据库表的实体类

    这篇文章主要介绍了Mybatis自动生成数据库表的实体类的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • mybatis 映射文件中if标签判断字符串相等的两种方式

    mybatis 映射文件中if标签判断字符串相等的两种方式

    这篇文章主要介绍了mybatis 映射文件中if标签判断字符串相等的方式,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • SpringBoot内嵌tomcat处理有特殊字符转义的问题

    SpringBoot内嵌tomcat处理有特殊字符转义的问题

    这篇文章主要介绍了SpringBoot内嵌tomcat处理有特殊字符转义的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Springboot跨域处理的多种方式小结

    Springboot跨域处理的多种方式小结

    当一台服务器资源从另一台服务器(不同 的域名或者端口)请求一个资源或者接口,就会发起一个跨域 HTTP 请求,这篇文章主要介绍了Springboot跨域处理的多种方式小结,需要的朋友可以参考下
    2023-11-11
  • SpringBoot实现插件化架构的4种方案详解

    SpringBoot实现插件化架构的4种方案详解

    在复杂业务场景下,传统的单体应用架构往往面临着功能扩展困难等困难,插件化架构作为一种模块化设计思想的延伸,能够使系统具备更好的扩展性和灵活性,下面我们来看看SpringBoot环境下实现插件化架构的4种实现方案吧
    2025-05-05

最新评论