千家信息网

Spring @Cacheable注解中key怎么使用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"Spring @Cacheable注解中key怎么使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读
千家信息网最后更新 2026年11月02日Spring @Cacheable注解中key怎么使用

本篇内容介绍了"Spring @Cacheable注解中key怎么使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    Spring @Cacheable注解中key使用

    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;   }

    如果要调用当前类里面的方法

    当我们要使用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 "";    }
    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。

    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);   }
    beforeInvocation属性

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

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

    其实除了使用@CacheEvict清除缓存元素外,当我们使用Ehcache作为实现时,我们也可以配置Ehcache自身的驱除策略,其是通过Ehcache的配置文件来指定的。由于Ehcache不是本文描述的重点,这里就不多赘述了,想了解更多关于Ehcache的信息,请查看我关于Ehcache的专栏。

    @Caching

    @Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

    @Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),@CacheEvict(value = "cache3", allEntries = true) })   public User find(Integer id) {      return null;   }
    使用自定义注解

    Spring允许我们在配置可缓存的方法时使用自定义的注解,前提是自定义的注解上必须使用对应的注解进行标注。如我们有如下这么一个使用@Cacheable进行标注的自定义注解。

    @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;   }

    @Cacheable 拼接key

    @Cacheable(value = "page_user",key ="T(String).valueOf(#page).concat('-').concat(#pageSize)",unless = "#result=null")//由于page是int型,concat要求变量必须为String,所以强转一下@Overridepublic List page(int page, int pageSize) {    return userMapper.page(page,pageSize);}

    "Spring @Cacheable注解中key怎么使用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

    方法 缓存 属性 注解 元素 结果 参数 对象 策略 表达式 使用方法 更多 并将 支持 生成 配置 成功 信息 内容 功能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 奇酷互联网络科技 撒么互联网科技公司 天扬科技互联网广告 居家互联网科技有限公司 济南和联互联网科技有限公司 银川新华互联网科技学校地址 北京三清互联网科技 深圳前海聚择互联网科技有限公司 承德科技产业互联网发展 阿里互联网科技公司 佳云科技和互联网广告 湖北码尼互联网科技有限公司电话 互联网科技公司实习生 青海科技产业互联网发展 银川新华互联网科技学校联系电话 伊宁互联网科技做什么的 互联网科技圈年度人物 黑云互联网科技有限公司 山东蛋芒互联网科技有限公司 金诺互联网科技 互联网 科技创新 润盈互联网科技 互联网科技的未来发展 互联网科技英文翻译 宁夏科技产业互联网案例 互联网科技和法律行业 35岁以上互联网科技行业 中国科技和美国互联网 广州全民伙伴互联网科技有限公司
    0