基础环境:spring 5
1. maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2. 启用 @EnableCaching
需要在spring容器中使用。
@Configuration
@EnableCaching
public class AppConfig {
}
3. 注解功能
-
@Cacheable: 缓存某个数据
-
@CacheEvict: 清除某个缓存,或者所有缓存
-
@CachePut: 缓存某个数据,但是会调用函数,一般用于新增或者修改某个数据,然后更新缓存值。
-
@Caching: 配置于函数上,组合多个Cache注解使用。
-
@CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置
4. @Cacheable 缓存数据。
作用:当触发函数调用时,会先从缓存中查询数据,如果没有,则执行函数,并将结果缓存起来。其中注解的一些属性,需要仔细了解下。
4.1 源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
// value 和 cacheNames 相同,均表示存放命名空间,可多个。
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
// 键,缓存的值,是以key-value的形式存放,如果不设置,会使用键的生成规则产生一个key
String key() default "";
// 键生成规则 和 key 属性互斥,如果同时使用会抛异常
String keyGenerator() default "";
// 缓存管理器 TODO 功能未研究
String cacheManager() default "";
// 缓存解析器 TODO 功能未研究
String cacheResolver() default "";
// 缓存条件,满足指定条件的才进行缓存,spring el 表达式
String condition() default "";
// 缓存条件,不同于condition,可在结果执行完后进行判断操作
String unless() default "";
// 是否同步,多线程环境,可能会多次计算缓存,依赖于缓存插件是否支持,比如encache等。
boolean sync() default false;
}
4.3 使用
@Cacheable(cacheNames = "cache", key = "#p0")
public double getOne(String id) {
return Math.random();
}
5 @CacheEvict 清除缓存
-
可以清楚指定的一个缓存
-
也可以清楚某个命名空间下的所有缓存。
5.1 源码
package org.springframework.cache.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CacheEvict {
// 命名空间,用于标识清除哪个名字的缓存,同cacheNames
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
// 指定清除某一个缓存
String key() default "";
// 指定缓存key生成策略,根据策略生成的key,进行清除
String keyGenerator() default "";
// 缓存管理器 TODO 功能待研究
String cacheManager() default "";
// 缓存解析器 TODO 功能待研究
String cacheResolver() default "";
// 清除条件
String condition() default "";
// 是否清除指定value下的所有缓存
boolean allEntries() default false;
boolean beforeInvocation() default false;
}
6 @CachePut
也用于缓存某个数据,不同于@Cacheable, @CachePut,无论如何都会调用函数执行,然后进行缓存操作,常用于新增或者修改,需要更新缓存。
6.2 源码
**package org.springframework.cache.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CachePut {
// 命名空间,用于将缓存存放在哪个缓存名下。同cacheNames
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
// 指定键
String key() default "";
// 指定键生成规则,与key互斥,同时存在,抛异常
String keyGenerator() default "";
// 缓存管理器,TODO 未研究
String cacheManager() default "";
// 缓存解析器,TODO 未研究
String cacheResolver() default "";
// 条件。入参
String condition() default "";
// 条件。返回值。
String unless() default "";
}
7 @Caching
从源码中看,这是一个综合性注解。包含 Cacheable 、CachePut、 CacheEvict 三种功能,都可以分别进行设置。
7.2 源码
package org.springframework.cache.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Caching {
Cacheable[] cacheable() default {};
CachePut[] put() default {};
CacheEvict[] evict() default {};
}
8 @CacheConfig
8.1 源码
提取了 Cacheable 、CachePut、 CacheEvict、Caching 四种注解共有属性,作用于类上,这样,类中使用这些注解的都采用CacheConfig 设置的属性,可以不用每个都写相同的属性。
package org.springframework.cache.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheConfig {
// 缓存名称
String[] cacheNames() default {};
// 键生成策略
String keyGenerator() default "";
// 缓存管理器
String cacheManager() default "";
// 缓存解析器
String cacheResolver() default "";
}