Spring Cache基础组件 Annotation

相关阅读

常用注解

名称说明
@Cacheable缓存数据,如果缓存中存在则直接使用缓存;如果不存在,执行方法并将结果放入缓存
@CachePut保证方法被调用,并且结果被缓存,与@Cacheable的区别在于方法是否每次被调用,常用于更新缓存
@CacheEvict清空缓存
@Caching组合多个Cache注解
@CacheConfig统一配置缓存注解的属性,作用于类
@EnableCaching开启缓存功能

SpEL表达式简介

名称位置说明示例
methodNameroot对象当前被调用的方法名#root.methodName
methodroot对象当前被调用的方法#root.method.name
targetroot对象当前被调用的目标对象实例#root.target
targetClassroot对象当前被调用的目标对象的类#root.targetClass
argsroot对象当前被调用的方法的参数列表#root.args[0]
cachesroot对象当前被调用的方法使用的缓存列表#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值