〇、常用注解
包地址 | 注解名 | 作用域 | 作用 |
---|---|---|---|
org.springframework.cache.annotation | CacheConfig | 类级别 | s设置缓存的公共配置 |
Cacheable | 方法级别 | 缓存读取操作 | |
CacheEvict | 方法级别 | 缓存失效操作 | |
CachePut | 方法级别 | 缓存更新操作 | |
Caching | 方法级别 | h混合读取、失效、更新操作 | |
CacheConfig | 方法级别 | 统一配置缓存注解的属性,作用于类 | |
EnableCaching | 方法级别 | 开启缓存功能 |
一、@Cacheable注解
属性 | 默认值 | 描述 |
---|---|---|
value | 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 | |
cacheNames | 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 | |
key | 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 | |
keyGenerator | ||
cacheManager | ||
cacheResolver | ||
condition | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。不能使用返回结果 | |
unless | 不缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 false才进行缓存。可以使用返回结果 | |
sync |
- 简介:表示该方法执行后的结果可以被缓存;可作用于类和方法,作用于类上,则表示对该类的所有方法都有效;
- 执行逻辑:查找对应的缓存是否存在,若不存在,该方法会被调用,并且将返回结果放入缓存;若存在,则不调用方法,直接返回缓存的结果;
1.1 案例
注解业务案例 单一缓存名称和键:
@Cacheable("books")
public Book findBookById(String id) {
// 业务逻辑
}
多个缓存名称和条件:
@Cacheable(value = {"books", "archivedBooks"}, condition = "#id.length() > 10")
public Book findBookWithComplexKey(String id) {
// 业务逻辑
}
@Service
public class MyService {
/**
* 一个使用 @Cacheable 所有属性的案例。
*
* @param id 用户ID
* @return 返回用户对象
*/
@Cacheable(
value = "users", // 缓存名称
key = "#id", // 缓存键,使用SpEL表达式
condition = "#id.length() > 3", // 缓存条件,只有当ID长度大于3时才缓存
unless = "#result == null" // 除非条件,如果结果为null,则不缓存
)
public User findUserById(String id) {
// 模拟数据库查询操作,这里假设ID长度小于3时没有结果
if (id == null || id.length() <= 3) {
return null;
}
return performDatabaseQuery(id);
}
private User performDatabaseQuery(String id) {
// 模拟数据库查询逻辑
return new User(id, "Name based on ID");
}
}
1.2 核心源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
// 缓存KEY所在缓存的标识符,支持多个,CSV格式
@AliasFor("cacheNames")
String[] value() default {};
// 缓存KEY所在缓存的标识符,支持多个,CSV格式
@AliasFor("value")
String[] cacheNames() default {};
// 缓存的KEY,支持SpEL表达式动态计算
// 默认为空(缺省按照方法的所有参数组合生成SimpleKey)
String key() default "";
// 缓存KEY生成器
String keyGenerator() default "";
// 缓存管理器
String cacheManager() default "";
// 缓存解析器
String cacheResolver() default "";
// 缓存的条件,使用SpEL表达式,方法调用前计算,当结果为true时执行动作
// 默认为空,表示总是缓存方法返回值
String condition() default "";
// 否决缓存的条件,使用SpEL表达式,方法调用后计算(可使用result),当结果为true时不执行动作
// 默认为空,表示永不否决;
String unless() default "";
// 使用异步模式标识
boolean sync() default false;
}
二、@CachePut
注解作用:@CachePut 注解用于在方法执行后更新缓存。
注解属性:与@Cacheable相同。
- 简介:表示该方法执行后的结果需要更新到缓存;可作用于类和方法,作用于类上,则表示对该类的所有方法都有效;
- 执行逻辑:和Cacheable不同的是,带有CachePut注解的方法一定会被执行,方法执行后的结果由condition/unless判定是否存入缓存;
2.1 案例
@CachePut("books")
public Book updateBookDetails(String id, Book details) {
// 业务逻辑
}
@Service
public class MyService {
/**
* 使用 @CachePut 所有属性的案例。
*
* @param user 用户对象,包含ID
* @return 更新后的用户对象
*/
@CachePut(
value = "users", // 缓存名称
key = "#user.id", // 缓存键,使用SpEL表达式
condition = "#user.age > 18" // 条件,只有当用户年龄大于18时才更新缓存
)
public User updateUserProfile(User user) {
// 模拟更新用户信息的业务逻辑
return performUpdate(user);
}
private User performUpdate(User user) {
// 模拟更新逻辑
user.setName("Updated Name");
return user;
}
}
2.2 核心源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CachePut {
// 缓存KEY所在缓存的标识符,支持多个,CSV格式
@AliasFor("cacheNames")
String[] value() default {};
// 缓存KEY所在缓存的标识符,支持多个,CSV格式
@AliasFor("value")
String[] cacheNames() default {};
// 缓存的KEY,可以为空(缺省按照方法的所有参数组合生成SimpleKey);
// 支持SpEL表达式
String key() default "";
// KEY的生成器
String keyGenerator() default "";
// 缓存管理器
String cacheManager() default "";
// 缓存解析器
String cacheResolver() default "";
// 放置缓存的条件,使用SpEL表达式,方法调用后计算(可使用result),当结果为true时执行动作
// 默认为空,表示方法结果总是被缓存
String condition() default "";
// 否决放置缓存的条件,使用SpEL表达式,方法调用后计算(可使用result),当结果为true时不执行动作
// 默认为空,表示永不否决;
String unless() default "";
}
三、@CacheEvict
注解作用:@CacheEvict 注解用于在方法执行后清除缓存。
注解属性介绍:
-
value 或 cacheNames: 指定缓存名称,可以是单个或多个;
-
allEntries: 清除所有缓存项;
-
condition: 指定清除缓存的条件SpEL表达式;
-
简介:表示清除该方法的缓存KEY对应的缓存;可作用于类和方法,作用于类上,则表示对该类的所有方法都有效;
3.1 案例
清除特定缓存名称的条目:
@CacheEvict("books")
public void deleteBook(String id) {
// 业务逻辑
}
清除所有缓存名称的所有条目:
@CacheEvict(allEntries = true)
public void clearAllCaches() {
// 业务逻辑
}
3.2 核心源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CacheEvict {
// 缓存KEY所在缓存的标识符,支持多个,CSV格式
@AliasFor("cacheNames")
String[] value() default {};
// 缓存KEY所在缓存的标识符,支持多个,CSV格式
@AliasFor("value")
String[] cacheNames() default {};
// 缓存的KEY,可以为空(缺省按照方法的所有参数组合生成SimpleKey);
// 支持SpEL表达式
String key() default "";
// KEY的生成器
String keyGenerator() default "";
// 缓存管理器
String cacheManager() default "";
// 缓存解析器
String cacheResolver() default "";
// 清除缓存的条件,使用SpEL表达式,执行次序由beforeInvocation()决定
// 默认为空,表示总是清除缓存
String condition() default "";
// 删除缓存中所有条目标识
// 默认为false,表示只删除指定KEY的值
boolean allEntries() default false;
// 方法调用前执行标识
// 默认为false,表示方法成功调用(未抛出异常)后执行;为true则方法调用前执行
boolean beforeInvocation() default false;
}
四、@Caching(不常用)
注解作用:@Caching 注解用于组合多个缓存操作。
注解属性介绍:
-
value: 包含多个缓存操作的数组;
-
简介:表示多个Cache注解的组注解;可作用于类和方法,作用于类上,则表示对该类的所有方法都有效;
4.1 案例
@Caching(
cacheable = {@Cacheable("books")},
put = {@CachePut("books")},
evict = {@CacheEvict("archivedBooks")}
)
public Book processBook(String id, Book details) {
// 业务逻辑
}
4.2 核心源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Caching {
// Cacheable集合
Cacheable[] cacheable() default {};
// CachePut集合
CachePut[] put() default {};
// CacheEvict集合
CacheEvict[] evict() default {};
}
五、@CacheConfig
注解作用:@CacheConfig 注解用于在类级别提供缓存相关的共享配置。
注解属性介绍:
-
cacheNames: 指定类中所有缓存操作的默认缓存名称;
-
keyGenerator: 指定默认的缓存键生成器;
-
condition: 指定类中所有缓存操作的默认条件;
-
简介:提供在类层次上共享缓存相关配置的机制;只可作用于类上;
当作用在某个类上,会给这个类中定义的所有缓存动作提供默认配置,当然,具体缓存动作的配置可覆盖提供的默认配置;
5.1 案例
@CacheConfig(cacheNames = "books", keyGenerator = "customKeyGenerator")
public class BookService {
// 类中的方法可以使用缓存注解
}
5.2 核心源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheConfig {
// 缓存KEY所在缓存的标识符,支持多个,CSV格式
String[] cacheNames() default {};
// KEY的生成器
String keyGenerator() default "";
// 缓存管理器
String cacheManager() default "";
// 缓存解析器
String cacheResolver() default "";
}
六、@EnableCaching
简介:
表示启用Spring的注解驱动的缓存管理能力,和@Configuration配合使用;
必须创建CacheManager Bean,Spring框架不会提供默认值;@EnableCaching会根据类型搜索CacheManager Bean,因此CacheManager Bean的命名并不重要;
可以实现CachingConfigurer接口的cacheManager()方法来创建@EnableCaching指定的CacheManager Bean,这种情况下需要明确提供KeyGenerator(@EnableCaching会默认提供SimpleKeyGenerator);如果不需要自定义,可以考虑从CachingConfigurerSupport扩展,它为所有方法提供了默认实现;
6.1 核心源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(CachingConfigurationSelector.class)
public @interface EnableCaching {
// 代理模式:CGLIB or JDK Interface
// 默认为false,表示基于JDK Interface
// 设置为true,会影响所有需要代理的Spring管理的Bean
boolean proxyTargetClass() default false;
// 缓存应用模式:Proxy or AspectJ
// Proxy模式只允许通过代理拦截调用,不会拦截同一类中的本地调用
// AspectJ模式下,proxyTargetClass()无效,会拦截同一类中的本地调用
AdviceMode mode() default AdviceMode.PROXY;
// 特定连接点应用多个建议时,缓存操作的执行顺序
int order() default Ordered.LOWEST_PRECEDENCE;
}