首页 > 其他分享 >@Cacheable详解

@Cacheable详解

时间:2023-10-19 22:46:04浏览次数:31  
标签:缓存 public SpEL Cacheable key id 详解

@Cacheable 是 Spring Framework 中的一个注解,它可以应用在方法上,用于声明该方法的结果可以被缓存起来,以便后续的调用可以直接返回缓存中的结果,而不必真正执行方法的代码。

@Cacheable 注解中的参数有以下几个:

  • value:缓存的名称,可以是一个字符串数组,表示该方法的结果可以被缓存到哪些缓存中。默认值为一个空数组,表示缓存到默认的缓存中。
  • key:缓存的 key,可以是一个 SpEL 表达式,表示缓存的 key 可以根据方法参数动态生成。默认值为一个空字符串,表示使用默认的 key 生成策略。
  • condition:缓存的条件,可以是一个 SpEL 表达式,表示缓存的结果是否应该被缓存。默认值为一个空字符串,表示不考虑任何条件,缓存所有结果。
  • unless:缓存的排除条件,可以是一个 SpEL 表达式,表示缓存的结果是否应该被排除在缓存之外。默认值为一个空字符串,表示不排除任何结果。

例如,下面的代码演示了如何使用 @Cacheable 注解:

@Service
public class MyService {
    @Cacheable(value = "myCache", key = "#id")
    public String getData(int id) {
        // 实际执行的代码
    }
}

这个示例中,getData 方法的结果可以被缓存到名为 myCache 的缓存中,缓存的 key 是方法的参数 id,缓存的条件和排除条件都是默认值。

 

注:SpEL(Spring Expression Language)

SpEL(Spring Expression Language)是Spring Framework中的一种表达式语言,它提供了一种简单的方式来访问和操作对象图形结构。SpEL可以在XML和注解中使用,它支持访问对象的属性、方法和构造函数参数,还支持算术、逻辑和关系运算符,以及条件、集合、正则表达式等语言特性。

SpEL的语法类似于Java语言,使用#{}符号来包含表达式,例如:

<bean id="myBean" class="com.example.MyBean">
    <property name="name" value="#{person.name}" />
    <property name="age" value="#{person.age + 5}" />
</bean>

在上面的示例中,SpEL表达式#{person.name}#{person.age + 5}分别被用作了MyBean对象的nameage属性的值。

除了在XML和注解中使用外,SpEL还可以在Spring的@Value注解中使用,用于注入属性值,例如:

@Value("#{systemProperties['java.home']}")
private String javaHome;

上面的代码使用SpEL表达式#{systemProperties['java.home']}获取了Java运行时环境的安装路径,并将其注入到javaHome属性中。

总之,SpEL是Spring Framework中非常强大和灵活的表达式语言,它可以帮助我们轻松地访问和操作对象图形结构,提高了应用程序的可维护性和可扩展性。

 

Springboot项目中如何使用@Cacheable:

第一步:首先需要在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

第二步:然后在启动类上添加@EnableCaching注解,开启缓存功能:

@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

第三步:在方法上使用注解

@Service
public class UserService {
    
    @Autowired
    private UserDao userDao;
    
    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(int id) {
        return userDao.getUserById(id);
    }
    
}

在上面的代码中,@Cacheable注解被用于getUserById方法上,表示该方法的返回值需要被缓存。缓存的名称为"userCache",缓存的key为方法的参数id。

 

需要注意的是,使用@Cacheable注解时,需要在Spring Boot配置文件中配置缓存的类型和相关属性。例如,可以使用以下配置来启用基于Redis的缓存:

spring:
  cache:
    type: redis
    redis:
      host: localhost
      port: 6379

以上配置表示使用Redis作为缓存,Redis的地址为localhost:6379。

 

 @Cacheable高级用法

  1. 指定缓存的key

默认情况下,@Cacheable会使用方法的参数作为缓存的key。但是有时候我们需要自定义key,可以使用key属性来指定,例如:

@Cacheable(value = "myCache", key = "#id")
public String myMethod(int id) {
    // ...
}

上述代码表示使用方法的参数id作为缓存的key。

  1. 指定缓存的条件

有时候我们希望只有满足一定条件才会将返回值缓存起来,可以使用condition属性来指定条件,例如:

@Cacheable(value = "myCache", condition = "#result != null")
public String myMethod() {
    // ...
}

上述代码表示只有方法的返回值不为null时才将其缓存起来。

  1. 指定缓存的过期时间

有时候我们希望缓存的数据能够自动过期,可以使用expire属性来指定过期时间,例如:

@Cacheable(value = "myCache", key = "#id", expire = 3600)
public String myMethod(int id) {
    // ...
}

上述代码表示将缓存的数据在3600秒后自动过期。

以上就是@Cacheable的高级用法,下面是Java代码实现方式:

标签:缓存,public,SpEL,Cacheable,key,id,详解
From: https://www.cnblogs.com/huangdh/p/17775887.html

相关文章

  • Java资源文件获取方法详解:从 Classpath 到 Web 应用程序
    在Java开发中,访问和读取资源文件是一个常见的需求。这些资源可以是配置文件、图像、音频、视频、文本文件等。在Java中,获取资源文件有多种方式,包括直接通过类路径(Classpath)访问,或者通过Web应用程序的上下文路径(ContextPath)访问。以下我们将详细探讨这些方法。通过类路径(Classpath)......
  • Linux下KVM平台知识详解(1)——KVM基础知识
    一、虚拟化简介(一)虚拟化概述在计算机中,虚拟化技术是一种资源管理技术,可以将计算机的各硬件资源(包括CPU、内存、磁盘、网络)等予以抽象,转换后呈现出来,以供用户更好的使用。系统虚拟化可以将底层物理设备、上层操作系统和软件之间分离,可以在一台物理设备上划分出多台机器。虚拟化技术......
  • Android(S)系统属性服务详解
    1.简介 Android系统中,为统一管理系统的属性,设计了一个统一的属性系统,包括两部分:文件保存的持久属性和每次开机导入的cache属性,前者主要保存在.prop文件中,需要注意的是android属性的名称是有一定的格式要求。每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Andro......
  • 神经网络基础篇:详解二分类(Binary Classification)
    二分类注:当实现一个神经网络的时候,通常不直接使用for循环来遍历整个训练集(编程tips)举例逻辑回归逻辑回归是一个用于二分类(binaryclassification)的算法。首先从一个问题开始说起,这里有一个二分类问题的例子,假如有一张图片作为输入,比如这只猫,如果识别这张图片为猫,则输出标签......
  • huawei交换机基本配置,入门视图详解
    一、交换机基本配置1、交换机连接方式本地:计算机COM口/USB口-->Console线-->交换机Console口远程:Putty、SecureCRT、Xshell远程管理工具2、网络操作系统1)有四种视图模式<*> //用户视图:查看运行状态或其他参数[*] //系统视图:配置设备的系统参数[*-GigabitEthernet0/0......
  • Unity3D 如何制作带厚度的透明图片详解
    Unity3D是一款功能强大的游戏开发引擎,可以实现各种复杂的游戏效果。本文将详细介绍如何使用Unity3D制作带厚度的透明图片,并提供代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。在Unity3D中,......
  • 3D游戏开发中的数学知识矩阵详解
    矩阵很多同学没有接触过,所以感觉很难,很复杂,其实只要学过矩阵的同学都知道,矩阵运算并不难。今天我们给大家讲讲游戏开发中的矩阵的运算。1:矩阵是什么?矩阵是描述线性变换的一种数学工具,线性变换指的是使用一次函数从一个空间变换到另外一个空间。例如在空间A中的一个2维向量(xa......
  • LSTM-CRF模型详解和Pytorch代码实现
    在快速发展的自然语言处理领域,Transformers已经成为主导模型,在广泛的序列建模任务中表现出卓越的性能,包括词性标记、命名实体识别和分块。在Transformers之前,条件随机场(CRFs)是序列建模的首选工具,特别是线性链CRFs,它将序列建模为有向图,而CRFs更普遍地可以用于任意图。本文中crf......
  • javascript之分片上传,断点续传的实际项目实现详解
    首先,我们需要了解什么是分片上传和断点续传。分片上传是将大文件分成多个小块进行上传,每个小块可以独立上传,从而提高上传速度和稳定性。而断点续传是指在上传大文件时,当上传过程中因断网或其他原因中断,再次上传时可以不用重头开始,而是从中断的地方继续上传。接下来是分片上传和......
  • Python入门进阶:68 个 Python 内置函数详解
    内置函数就是Python给你提供的,拿来直接用的函数,比如print.,input等。截止到python版本3.6.2,python一共提供了68个内置函数,具体如下abs()dict()help()min()setattr()all()dir()hex()next()slice()any()divmod()id()object()sorted()ascii()enumerate()input()......