Spring @Cacheable注解中key详解

Spring @Cacheable注解中key详解nbsp key 属性是用来指定 Spring 缓存方法的返回结果时对应的 key 的 该属性支持 SpringEL 表达式 当我们没有指定该属性时 Spring 将使用默认策略生成 key 我们这里先来看看自定义策略 至于默认策略会在后文单独介绍 nbsp nbsp nbsp nbsp nbsp nbsp 自定义策略是指我们可以通过 Spring 的 EL 表达式来指定我们的 key 这里的 EL 表达式可以使用方法参数及它们对应的属性 使用方法参数时我们可以直接使用 参数

 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;

   }

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

   @Cacheable(value={“users”, “xxx”}, key=”caches[1].name”)

   public User find(User user) {

      returnnull;

   }

@Override @Cacheable(value={"TeacherAnalysis_public_chart"}, key="#root.target.getDictTableName() + '_' + #root.target.getFieldName()") public List 
  
    > getChartList(Map 
   
     paramMap) { } public String getDictTableName(){ return ""; } public String getFieldName(){ return ""; } 
    
  
 @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("users")//每次都会执行方法,并将结果存入指定的缓存中 public User find(Integer id) { return null; }
@CacheEvict(value="users", allEntries=true) public void delete(Integer id) { System.out.println("delete user by id: " + id); }
@CacheEvict(value="users", beforeInvocation=true) public void delete(Integer id) { System.out.println("delete user by id: " + id); }
@Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"), @CacheEvict(value = "cache3", allEntries = true) }) public User find(Integer id) { return null; }
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Cacheable(value="users") public @interface MyCacheable { }

那么在我们需要缓存的方法上使用@MyCacheable进行标注也可以达到同样的效果

@MyCacheable public User findById(Integer id) { System.out.println("find user by id: " + id); User user = new User(); user.setId(id); user.setName("Name" + id); return user; }

 

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

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

(0)
上一篇 2026年3月17日 下午8:51
下一篇 2026年3月17日 下午8:52


相关推荐

  • NRZ 对比 PAM4 调制技术

    NRZ 对比 PAM4 调制技术云计算和大数据等领先趋势推动了指数级的流量增长和 400G 以太网的兴起 数据中心网络面临着更大的带宽需求 基础设施需要创新技术来满足不断变化的需求 目前 针对下一代以太网研究了两种不同的信号调制技术 不归零 NRZ 和 4 级脉冲幅度调制 PAM4 本文将带您了解这两种调制技术并进行比较 以找到 400G 以太网的最佳选择 NRZ 和 PAM4 基础知识 NRZ 是一种使用两个信号电平来表示数字逻辑信号的 1 0 信息的调制技术 逻辑 0 是负电压 逻辑 1 是正电压 在每个时钟周期内可以发送或接收一位逻辑

    2026年3月19日
    4
  • 阅读书源最新2020在线导入_【授人以渔】你想要阅读的,这里都有。「建议收藏」

    阅读书源最新2020在线导入_【授人以渔】你想要阅读的,这里都有。「建议收藏」今天给大家分享两个阅读软件,安卓、ios都有。通过订阅大佬们制作的书源(小说网站),80%你想看的小说,都能找到。(只要网络上有人分享上传了)﹀﹀﹀一、阅读(安卓)1、下载链接:https://www.coolapk.com/apk/io.legado.app.release2、食用方法:方法一(网络导入):  复制源URL,打开阅读”订阅”->点击右上角设置->选择”…

    2022年6月15日
    67
  • NorthWind 数据库「建议收藏」

    NorthWind 数据库「建议收藏」NorthWind数据库Categories:产品类别;Customers:客户;Employees:雇员EmployeesTerritories:员工涉及领域OrderDetails:订单明细Orders:订单Products:产品Region:地区Shippers:运货商Suppliers:供应商Territories:地域    在NorthWind

    2025年8月24日
    8
  • java 二维数组排序

    java 二维数组排序①使用Comparator生成一个比较器对象初始化数组:int[][]arr=newint[m][n];排序规则:先按数组的第一个元素进行升序排序,若第一个元素相等,则按照第二个元素进行升序排序。使用API:Arrays.sort()(T[]a,Comparator<?superT>c),该API根据给定的比较器(设定排序方式)对指定的数组进行排序。代码实现:Arrays.sort(arr,newComparator<int[]>(){

    2022年6月5日
    40
  • Django(23)Django限制请求装饰器

    Django(23)Django限制请求装饰器前言有时候,我们想要限制访问的请求方法,比如我们希望用户只能通过get方式请求,post不允许,那么我们可以采用装饰器的方式,django已经为我们提供了内置的装饰器限制请求装饰器Django内

    2022年7月30日
    12
  • python创建学生管理系统_学员管理系统 培训机构

    python创建学生管理系统_学员管理系统 培训机构使用面向对象完成了学员管理系统,实现了添加、删除、修改、查询、保存读取等功能。将学员、学员管理后台、开始入口分为了3个py文件,分别是Student.py、Student_management.py、main.py。保存文件名叫student.txt文件。内含注释,我也是给初学者,可能有些地方解释不清楚。Student.py代码如下#定义学生的类classStudent(object):def__init__(self,name,gender,number):

    2025年12月7日
    6

发表回复

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

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