三十七、缓存注解@Cacheable、@CacheEvict、@CachePut详解

三十七、缓存注解@Cacheable、@CacheEvict、@CachePut详解nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 缓存注解 Cacheable CacheEvict CachePut 详解一 Cacheable 用法详解 1 用在哪里 nbsp nbsp nbsp nbsp 用在方法或者类上 2 这两种用法有什么区别 nbsp nbsp nbsp nbsp 用

#        缓存注解@Cacheable、@CacheEvict、@CachePut详解

一、@Cacheable用法详解

默认策略:在value值后双“::”拼接,形参列表,当形参是对象时,使用json格式:

@CacheConfig(cacheNames="enterprise")// 
    public interface EnterpriseRepo extends JpaRepository 
   
     ,JpaSpecificationExecutor 
    
      { @Cacheable(value="cash1") Enterprise findByid(Integer id); @CachePut(value="cash1") Enterprise save(Enterprise enterprise); } 
     
   

这里写图片描述

自定义策略:

    key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。

    自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例。

 @Cacheable(value="users", key="#id") public User find(Integer id) { returnnull; } @Cacheable(value="users", key="#p0") public User find(Integer id) { returnnull; } @Cacheable(value="users", key="#user.id") public User find(User user) { returnnull; } @Cacheable(value="users", key="#p0.id") public User find(User user) { returnnull; } 

    除了上述使用方法参数作为key之外,Spring还为我们提供了一个root对象可以用来生成key。通过该root对象我们可以获取到以下信息。

这里写图片描述

当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。如:

@Cacheable(value={"users", "xxx"}, key="caches[1].name") public User find(User user) { returnnull; } 

6、condition属性指定发生的条件

    有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。如下示例表示只有当user的id为偶数时才会进行缓存。

@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0") public User find(User user) { System.out.println("find user by user " + user); return user; } 

二、@CachePut

    在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中

    一般使用在保存,更新方法中。

    @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。

    @CachePut(“users”)//每次都会执行方法,并将结果存入指定的缓存中

 public User find(Integer id) { return null; } 

三、@CacheEvict

    @CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。

#1、 allEntries属性

    allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。

@CacheEvict(value="users", allEntries=true) public void delete(Integer id) { System.out.println("delete user by id: " + id); } 

#2、 beforeInvocation属性

    清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

@CacheEvict(value="users", beforeInvocation=true) public void delete(Integer id) { System.out.println("delete user by id: " + id); } 

三十七、缓存注解@Cacheable、@CacheEvict、@CachePut详解




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204319.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午8:33
下一篇 2026年3月19日 下午8:34


相关推荐

  • 【Chrome必备插件,一键提升10倍效率】新用户永久免广告,好用!

    经过程序猿哥哥们马不停蹄的疯狂开发CSDNChrome插件终于又双叒叕更新啦快看看这次带来了什么神仙功能助你的开发速度起飞就现在快去戳下方下载体验一下吧~下载官网下载官网下载官网(悄咪咪的告诉大家!文末送大奖噢!快去参加吧~这次我们对小伙伴们反映比较多的新标签页做了重大更新,更新完成后的界面是这个样子的!在这里可以自行添加喜欢的搜索入口噢~还可以定制个性化的桌面快捷图标同时壁纸也是可以更换哒之前咱们介绍的插件的功能大家还记得嘛?小搜搜再来带大家温习一遍咱们的插件功能~新

    2022年4月8日
    46
  • 全网最省心!扣子版OpenClaw保姆级部署与进阶玩法

    全网最省心!扣子版OpenClaw保姆级部署与进阶玩法

    2026年3月13日
    1
  • 矩阵求逆c++实现[通俗易懂]

    矩阵求逆c++实现[通俗易懂]矩阵求逆c++实现

    2022年8月21日
    9
  • 最全的js正则表达式用法大全_js正则表达式语法大全

    最全的js正则表达式用法大全_js正则表达式语法大全匹配中文字符的正则表达式:[u4e00-u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了匹配双字节字符(包括汉字在内):[^x00-xff]评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正则表达式:ns*r评注:可以用来删除空白行匹配HTML标记的正则表达式:]*>.*?|评注:网上流

    2025年6月1日
    3
  • 小心踩雷,一次Java内存泄漏排查实战

    小心踩雷,一次Java内存泄漏排查实战前些日子小组内安排值班 轮流看顾我们的服务 主要做一些报警邮件处理 Bug 排查 运营 issue 处理的事 工作日还好 无论干什么都要上班的 若是轮到周末 那这一天算是毁了 不知道是公司网络广了就这样还是网络运维组不给力 网络总有问题 不是这边交换机脱网了 就是那边路由器坏了 还偶发地各种超时 而我们灵敏的服务探测服务总能准确地抓住偶现的小问题 给美好的工作加点料

    2026年3月17日
    2
  • 【转】使用Chrome Frame,彻底解决浏览器兼容问题「建议收藏」

    【转】使用Chrome Frame,彻底解决浏览器兼容问题「建议收藏」本文转自http://www.ryanbay.com/?p=269,感谢该作者的总结 X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的。通过在meta中设置X-UA-Compatible的值,可以指定网页的兼容性模式设置。在网页中指定的模式优先权高于服务器中(通过HTTPHeader)所指定的模式。兼容性模式设置优先级: metatag>…

    2022年7月16日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号