Spring Cache --- @Cacheable/@CachePut/@CacheEvict注解的原理深度剖析和使用

这里只是部分:需要深入了解可以看原著:

原文链接: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 "";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值