@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
对象的name
和age
属性的值。
除了在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高级用法
- 指定缓存的key
默认情况下,@Cacheable会使用方法的参数作为缓存的key。但是有时候我们需要自定义key,可以使用key属性来指定,例如:
@Cacheable(value = "myCache", key = "#id")
public String myMethod(int id) {
// ...
}
上述代码表示使用方法的参数id作为缓存的key。
- 指定缓存的条件
有时候我们希望只有满足一定条件才会将返回值缓存起来,可以使用condition属性来指定条件,例如:
@Cacheable(value = "myCache", condition = "#result != null")
public String myMethod() {
// ...
}
上述代码表示只有方法的返回值不为null时才将其缓存起来。
- 指定缓存的过期时间
有时候我们希望缓存的数据能够自动过期,可以使用expire属性来指定过期时间,例如:
@Cacheable(value = "myCache", key = "#id", expire = 3600)
public String myMethod(int id) {
// ...
}
上述代码表示将缓存的数据在3600秒后自动过期。
以上就是@Cacheable的高级用法,下面是Java代码实现方式: