Spring Cache注解@Cacheable的九个属性详解

 更新时间:2025年05月22日 12:04:58   作者:扛麻袋的少年  
在@Cacheable注解的使用中,共有9个属性供我们来使用,这9个属性分别是:value、 cacheNames、 key、 keyGenerator、 cacheManager、 cacheResolver、 condition、 unless、 sync,下面介绍@Cacheable注解属性使用方法,感兴趣的朋友一起看看吧

1.value/cacheNames 属性

如下图所示,这两个属性代表的意义相同,根据@AliasFor注解就能看出来了。这两个属性都是用来指定缓存组件的名称,即将方法的返回结果放在哪个缓存中,属性定义为数组,可以指定多个缓存;

//这两种配置等价
@Cacheable(value = "user") //@Cacheable(cacheNames = "user")
User getUser(Integer id);

2.key属性

可以通过 key 属性来指定缓存数据所使用的的 key,默认使用的是方法调用传过来的参数作为 key。最终缓存中存储的内容格式为:Entry<key,value> 形式。

  • 如果请求没有参数:key=new SimpleKey();
  • 如果请求有一个参数:key=参数的值
  • 如果请求有多个参数:key=newSimpleKey(params);(你只要知道 key不会为空就行了)

key值的编写,可以使用 SpEL 表达式的方式来编写;除此之外,我们同样可以使用 keyGenerator 生成器的方式来指定 key,我们只需要编写一个 keyGenerator ,将该生成器注册到 IOC 容器即可。(keyGenerator的使用,继续往下看)

名字位置描述示例
methodNameroot object当前被调用的方法名#root.method.name
methodroot object当前被调用的方法#root.methodName
targetroot object当前被调用的目标对象#root.target
targetClassroot object当前被调用的目标对象类#root.targetClass
argsroot object当前被调用的方法的参数列表#root.args[0]
cachesroot object当前方法调用使用的缓存列表(如@Cacheable(value={“cache1”,“cache2”})),则有两个cache#root.caches[0].name
argument nameevaluation context方法参数的名字. 可以直接 #参数名 ,也可以使用 #p0或#a0 的形式,0代表参数的索引;#id、#p0、#a0
resultevaluation context方法执行后的返回值(仅当方法执行之后的判断有效,如’unless’、'cache put’的表达式 'cacheevict’的表达式beforeInvocation=false)#result

使用示例如下:

@Cacheable(value = "user",key = "#root.method.name")
User getUser(Integer id);

3.keyGenerator 属性

key 的生成器。如果觉得通过参数的方式来指定比较麻烦,我们可以自己指定 key 的生成器的组件 id。key/keyGenerator属性:二选一使用。我们可以通过自定义配置类方式,将 keyGenerator 注册到 IOC 容器来使用。

import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Method;
import java.util.Arrays;
@Configuration
public class MyCacheConfig {
    @Bean("myKeyGenerator")
    public KeyGenerator keyGenerator(){
        return new KeyGenerator(){
            @Override
            public Object generate(Object target, Method method, Object... params) {
                return method.getName()+ Arrays.asList(params).toString();
            }
        };
    }
    /**
     * 支持 lambda 表达式编写
     */
    /*@Bean("myKeyGenerator")
    public KeyGenerator keyGenerator(){
        return ( target,  method, params)-> method.getName()+ Arrays.asList(params).toString();
    }*/
}

4.cacheManager 属性

该属性,用来指定缓存管理器。针对不同的缓存技术,需要实现不同的 cacheManager,Spring 也为我们定义了如下的一些 cacheManger 实现()

CacheManger描述
SimpleCacheManager使用简单的Collection来存储缓存,主要用于测试
ConcurrentMapCacheManager使用ConcurrentMap作为缓存技术(默认)
NoOpCacheManager测试用
EhCacheCacheManager使用EhCache作为缓存技术,以前在hibernate的时候经常用
GuavaCacheManager使用google guava的GuavaCache作为缓存技术
HazelcastCacheManager使用Hazelcast作为缓存技术
JCacheCacheManager使用JCache标准的实现作为缓存技术,如Apache Commons JCS
RedisCacheManager使用Redis作为缓存技术

具体使用介绍,可参考:SpringBoot整合Redis实现数据缓存

5.cacheResolver 属性

该属性,用来指定缓存管理器。使用配置同 cacheManager 类似,可自行百度。(cacheManager指定管理器/cacheResolver指定解析器 它俩也是二选一使用)

6.condition 属性

条件判断属性,用来指定符合指定的条件下才可以缓存。也可以通过 SpEL 表达式进行设置。这个配置规则和上面表格中的配置规则是相同的。

@Cacheable(value = "user",condition = "#id>0")//传入的 id 参数值>0才进行缓存
User getUser(Integer id);
@Cacheable(value = "user",condition = "#a0>1")//传入的第一个参数的值>1的时候才进行缓存
User getUser(Integer id);
@Cacheable(value = "user",condition = "#a0>1 and #root.methodName eq 'getUser'")//传入的第一个参数的值>1 且 方法名为 getUser 的时候才进行缓存
User getUser(Integer id);

7.unless 属性

unless属性,意为"除非"的意思。即只有 unless 指定的条件为 true 时,方法的返回值才不会被缓存。可以在获取到结果后进行判断。

@Cacheable(value = "user",unless = "#result == null")//当方法返回值为 null 时,就不缓存
User getUser(Integer id);
@Cacheable(value = "user",unless = "#a0 == 1")//如果第一个参数的值是1,结果不缓存
User getUser(Integer id);

8.sync 属性

该属性用来指定是否使用异步模式,该属性默认值为 false,默认为同步模式。异步模式指定 sync = true 即可,异步模式下 unless 属性不可用。

到此这篇关于Spring Cache注解@Cacheable的九个属性详解的文章就介绍到这了,更多相关@Cacheable注解属性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现企业微信消息推送功能的详细步骤

    Java实现企业微信消息推送功能的详细步骤

    这篇文章主要介绍了Java实现企业微信消息推送功能,本文图文实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 一文详解如何在Java中自定义异常类

    一文详解如何在Java中自定义异常类

    这篇文章主要介绍了如何在Java中自定义异常类的相关资料,在Java编程中开发者可以通过继承Exception类或其子类创建自定义异常,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • 关于SpringBoot的热部署方案

    关于SpringBoot的热部署方案

    这篇文章主要介绍了关于SpringBoot的热部署方案,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本,本文就来详解热部署方案,需要的朋友可以参考下
    2023-05-05
  • java中关于转义字符的一个bug

    java中关于转义字符的一个bug

    本文主要介绍了java中关于转义字符的一个bug。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java读取无限量文件的思路和完整代码

    Java读取无限量文件的思路和完整代码

    这篇文章主要介绍了Java读取无限量文件的思路,文章还提供了完整实现代码和核心优化点解析,包括NIO.2替代传统IO、分场景读取、自定义线程池等,需要的朋友可以参考下
    2026-03-03
  • Java字符串常见的操作(比较,查找,替换等)

    Java字符串常见的操作(比较,查找,替换等)

    在Java当中,为字符串类提供了丰富的操作方法,对于字符串,我们常见的操作就是:字符串的比较、查找、替换、拆分、截取以及其他的一些操作,本文就详细的介绍一下,感兴趣的可以了解一下
    2022-01-01
  • Java实现SSH模式加密

    Java实现SSH模式加密

    这篇文章主要介绍了Java实现SSH模式加密的相关资料,需要的朋友可以参考下
    2016-01-01
  • Spring boot 路径映射的实现

    Spring boot 路径映射的实现

    这篇文章主要介绍了spring boot 路径映射的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java在Linux上调用FFmpeg实现视频截图的完整指南

    Java在Linux上调用FFmpeg实现视频截图的完整指南

    在Linux环境下使用Java与FFmpeg命令交互进行视频截图是多媒体处理中的常见任务,本文介绍了如何在Java程序中执行FFmpeg命令,通过提供具体代码示例来展示在特定时间点获取视频静态图像的方法,需要的朋友可以参考下
    2025-08-08
  • Centos下SpringBoot项目启动与停止脚本的方法

    Centos下SpringBoot项目启动与停止脚本的方法

    这篇文章主要介绍了Centos下SpringBoot项目启动与停止脚本的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11

最新评论