目录
一、Spring缓存注解
1. 注解@Cacheable
2. 注解@CachePut
3. 注解@CacheEvict
二、接口Cache
三、接口CacheManager
四、缓存封装类图
五、参考资料
本章节主要介绍Spring3.1后缓存注解使用和主要接口,及自己封装缓存,来实现一级、二级缓存。
一、Spring缓存注解
1. 注解@Cacheable
方法执行前:先从cache获取,若没有缓存再执行方法
方法执行后:根据condition判定参数是否符合、根据unless判定结果是否符合再进行缓存
@Cacheable(value = {"tabCache"}, key = "'tabCache:' + #tabId", cacheManager = "tabCacheManager", unless = "#result eq null")
public List<WcPendantTab> testRedisCacheAble(String tabId) {
// 组装查询参数
WcPendantTab tab = new WcPendantTab();
tab.setTabId(tabId);
// 查询
List<WcPendantTab> tabs = wcPendantTabDao.queryAll(tab);
return tabs;
}
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 java.util.concurrent.Callable;
import org.springframework.core.annotation.AliasFor;
/**
* 注意:
* 1. 注解位置:方法或类(所有方法)
* 2. 执行方法前,先从cache获取;若没有缓存再执行方法
* 3. cache没有数据,执行方法后,缓存到cache
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
/**
* 别名cacheNames属性
*/
@AliasFor("cacheNames")
String[] value() default {};
/**
* 1. cache的名称;别名value属性
* 2. 可以多个cache,如:value={"xxx1", "xxx2"}
*/
@AliasFor("value")
String[] cacheNames() default {};
/**
* 1. key值:遵循SpEL表达式
* 2. SpEL表达式:#root.method , #root.caches , #p1
* 3. 可自定义key的生成策略
*/
String key() default "";
/**
* 指定key的生成策略
*/
String keyGenerator() default "";
/**
* 指定CacheManager(缓存管理器)
*/
String cacheManager() default "";
/**
* 指定CacheResolver解析器
*/
String cacheResolver() default "";
/**
* 参数满足condition条件的结果才能缓存
*/
String condition() default "";
/**
* 方法执行后的结果:结果满足unless不缓存
* 如:unless = "#result eq null":null的结果不缓存
*/
String unless() default "";
/**
* 是否开启缓存同步,即:多个线程同步load同一个key
* 默认false;若为true,满足下列条件:
* a. 没有unless使用
* b. 只有一个cache
* c. 没有组合其他缓存相关操作
*/
boolean sync() default false;
}
2. 注解@CachePut
目的:更新缓存数据。方法执行后,缓存是否有数据,都要更新缓存
参数:参考@Cacheable
3. 注解@CacheEvict
目的:清除缓存数据
参数:参考@Cacheable,其中allEntries、beforeInvocation见下代码注释
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;
/**
* 目的:清除缓存数据
* @author Costin Leau
* @author Stephane Nicoll
* @author Sam Brannen
* @since 3.1
* @see CacheConfig
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CacheEvict {
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
String key() default "";
String keyGenerator() default "";
String cacheManager() default "";
String cacheResolver() default "";
String condition() default "";
/**
* 1. true时,清除cache下所有key,忽略#key
* 2. false(默认)时,清除cache下指定key
*/
boolean allEntries() default false;
/**
* 开启方法执行前清除缓存数据,默认false
* false时:方法正常执行结束后清除缓存,若异常结束则无法清除数据
* true时: 方法执行前清除缓存,与方法执行是否异常没有关系
*/
boolean beforeInvocation() default false;
}
二、接口Cache
该接口org.springframework.cache.Cache是定义对缓存基本的操作方法,如:get、put、evict、putIfAbsent等操作。如下图所示,是该接口的类图。
三、接口CacheManager
该接口org.springframework.cache.CacheManager是定义获取Cache的方法,如:getCache、getCacheNames。如下图所示,是该接口的类图。
四、缓存封装类图
本节参考多级缓存框架<一>,自己封装缓存的类图:
五、参考资料
缓存注解:
@AliasFor注解: