@Cacheable详解

@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代码实现方式:

posted @ 2023-10-19 22:37  BlogMemory  阅读(13323)  评论(0编辑  收藏  举报