相关阅读
常用注解
名称 | 说明 |
---|---|
@Cacheable | 缓存数据,如果缓存中存在则直接使用缓存;如果不存在,执行方法并将结果放入缓存 |
@CachePut | 保证方法被调用,并且结果被缓存,与@Cacheable的区别在于方法是否每次被调用,常用于更新缓存 |
@CacheEvict | 清空缓存 |
@Caching | 组合多个Cache注解 |
@CacheConfig | 统一配置缓存注解的属性,作用于类 |
@EnableCaching | 开启缓存功能 |
SpEL表达式简介
名称 | 位置 | 说明 | 示例 |
---|---|---|---|
methodName | root对象 | 当前被调用的方法名 | #root.methodName |
method | root对象 | 当前被调用的方法 | #root.method.name |
target | root对象 | 当前被调用的目标对象实例 | #root.target |
targetClass | root对象 | 当前被调用的目标对象的类 | #root.targetClass |
args | root对象 | 当前被调用的方法的参数列表 | #root.args[0] |
caches | root对象 | 当前被调用的方法使用的缓存列表 | #root.caches[0].name |
argumentName | 执行上下文 | 当前被调用的方法的参数 | #arg.properties |
result | 执行上下文 | 当前被调用的方法的返回值 | #result |
Cacheable
简介
表示该方法执行后的结果可以被缓存;可作用于类和方法,作用于类上,则表示对该类的所有方法都有效;
当带有Cacheable
注解的方法被调用时,会先判断对于给定的参数,当前方法是否已经被调用过;根据方法和参数生成对应的缓存KEY(支持SpEL
表达式,支持自定义KeyGenerator
),查找对应的缓存是否存在,若不存在,该方法会被调用,并且将返回结果放入缓存;若存在,则不调用方法,直接返回缓存的结果;
核心代码
@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
简介
表示该方法执行后的结果需要更新到缓存;可作用于类和方法,作用于类上,则表示对该类的所有方法都有效;
和Cacheable
不同的是,带有CachePut
注解的方法一定会被执行,方法执行后的结果由condition/unless
判定是否存入缓存;
核心代码
@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
简介
表示清除该方法的缓存KEY对应的缓存;可作用于类和方法,作用于类上,则表示对该类的所有方法都有效;
核心代码
@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
简介
表示多个Cache
注解的组注解;可作用于类和方法,作用于类上,则表示对该类的所有方法都有效;
核心代码
@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
简介
提供在类层次上共享缓存相关配置的机制;只可作用于类上;
当作用在某个类上,会给这个类中定义的所有缓存动作提供默认配置,当然,具体缓存动作的配置可覆盖提供的默认配置;
核心代码
@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
扩展,它为所有方法提供了默认实现;
核心代码
@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;
}