这里只是部分:需要深入了解可以看原著:
原文链接:https://blog.youkuaiyun.com/f641385712/article/details/94570960
关于Spring的缓存注解,一共有如下5个:
1、@Cacheable
:缓存
// @since 3.1 可以标注在方法上、类上 下同
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
// 缓存名称 可以写多个~
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
// 支持写SpEL,切可以使用#root
String key() default "";
// Mutually exclusive:它和key属性互相排斥。请只使用一个
String keyGenerator() default "";
String cacheManager() default "";
String cacheResolver() default "";
// SpEL,可以使用#root。 只有true时,才会作用在这个方法上
String condition() default "";
// 可以写SpEL #root,并且可以使用#result拿到方法返回值~~~
String unless() default "";
// true:表示强制同步执行。(若多个线程试图为**同一个键**加载值,以同步的方式来进行目标方法的调用)
// 同步的好处是:后一个线程会读取到前一个缓存的缓存数据,不用再查库了~~~
// 默认是false,不开启同步one by one的
// @since 4.3 注意是sync而不是Async
// 它的解析依赖于Spring4.3提供的Cache.get(Object key, Callable<T> valueLoader);方法
boolean sync() default false;
}
2、@CachePut
:缓存更新
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
// 注意:它和上面区别是。此处key它还能使用#result
String key() default "";
String keyGenerator() default "";
String cacheManager() default "";
String cacheResolver() default "";
String condition() default "";
String unless() default "";
}
3、@CacheEvict
:缓存删除
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
// 它也能使用#result
String key() default "";
String keyGenerator() default "";
String cacheManager() default "";
String cacheResolver() default "";
String condition() default "";
// 是否把上面cacheNames指定的所有的缓存都清除掉,默认false
boolean allEntries() default false;
// 是否让清理缓存动作在目标方法之前执行,默认是false(在目标方法之后执行)
// 注意:若在之后执行的话,目标方法一旦抛出异常了,那缓存就清理不掉了~~~~
boolean beforeInvocation() default false;
}
4、 @Caching
:用于处理复杂的缓存情况。比如用户既要根据id缓存一份,也要根据电话缓存一份,还要根据电子邮箱缓存一份,就可以使用它
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Caching {
Cacheable[] cacheable() default {};
CachePut[] put() default {};
CacheEvict[] evict() default {};
}
5、 @CacheConfig
:可以在类级别上标注一些共用的缓存属性。(所有方法共享,@since 4.1)
// @since 4.1 出现得还是比较晚的
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheConfig {
String[] cacheNames() default {};
String keyGenerator() default "";
String cacheManager() default "";
String cacheResolver() default "";
}