springCache注解详解
@CacheConfig:主要⽤于配置该类中会⽤到的⼀些共⽤的缓存配置。在这⾥@CacheConfig(cacheNames = "users"):配置了该数据访问对象中返回的内容将存储于名为users的缓存对象中,我们也可以不使⽤该注解,直接通过@Cacheable⾃⼰配置缓存集的名字来定义。
@Cacheable:配置了findByName函数的返回值将被加⼊缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。该注解主要有下⾯⼏个参数:
@Cacheable(cacheNames="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
@Cacheable(cacheNames="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
@Cacheable(cacheNames="books", key="T(someType).hash(#isbn)")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
@Cacheable(cacheNames="books", key="#map['bookid'].toString()")
public Book findBook(Map<String, Object> map)
缓存的同步 sync:
在多线程环境下,某些操作可能使⽤相同参数同步调⽤。默认情况下,缓存不锁定任何资源,可能导致多次计算,⽽违反了缓存的⽬的。对于这些特定的情况,属性 sync 可以指⽰底层将缓存锁住,使只有⼀个线程可以进⼊计算,⽽其他线程堵塞,直到返回结果更新到缓存中。例:
@Cacheable(cacheNames="foos", sync="true")
public Foo executeExpensiveOperation(String id) {...}
value、cacheNames:两个等同的参数(cacheNames为Spring 4新增,作为value的别名),⽤于指定缓存存储的集合名。由于Spring 4中新增了@CacheConfig,因此在Spring 3中原本必须有的value属性,也成为⾮必需项了cacheable
key:缓存对象存储在Map集合中的key值,⾮必需,缺省按照函数的所有参数组合作为key值,若⾃⼰配置需使⽤SpEL表达式,⽐如:
@Cacheable(key = "#p0"):使⽤函数第⼀个参数作为缓存的key值,更多关于SpEL表达式的详细内容可参考官⽅⽂档
condition:缓存对象的条件,⾮必需,也需使⽤SpEL表达式,只有满⾜表达式条件的内容才会被缓存,⽐如:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表⽰只有当第⼀个参数的长度⼩于3的时候才会被缓存,若做此配置上⾯的AAA⽤户就不会被缓存,读者可⾃⾏实验尝试。
@Cacheable(cacheNames="book", condition="#name.length < 32")
public Book findBook(String name)
unless:另外⼀个缓存条件参数,⾮必需,需使⽤SpEL表达式。它不同于condition参数的地⽅在于它的判断时机,该条件是在函数被调⽤之后才做判断的,所以它可以通过对result进⾏判断。
@Cacheable(cacheNames="book", condition="#name.length < 32", unless="#result.name.length > 5"")
public Book findBook(String name)
keyGenerator:⽤于指定key⽣成器,⾮必需。若需要指定⼀个⾃定义的key⽣成器,我们需要去实现
org.springframework.cache.interceptor.KeyGenerator接⼝,并使⽤该参数来指定。需要注意的是:该参数与key是互斥的cacheManager:⽤于指定使⽤哪个缓存管理器,⾮必需。只有当有多个时才需要使⽤
cacheResolver:⽤于指定使⽤那个缓存解析器,⾮必需。需通过org.springframework.cache.interceptor.CacheResolver接⼝来实现⾃⼰的缓存解析器,并⽤该参数指定。
除了这⾥⽤到的两个注解之外,还有下⾯⼏个核⼼注解:
@CachePut:配置于函数上,能够根据参数定义条件来进⾏缓存,它与@Cacheable不同的是,它每次都会真是调⽤函数,所以主要⽤于数据新增和修改操作上。它的参数与@Cacheable类似,具体功能可参考上⾯对@Cacheable参数的解析
@CachePut(cacheNames="book", key="#isbn")
public Book updateBook(ISBN isbn, BookDescriptor descriptor)
@CacheEvict:配置于函数上,通常⽤在删除⽅法上,⽤来从缓存中移除相应数据。除了同@Cacheable⼀样的参数之外,它还有下⾯两个参数:
allEntries:⾮必需,默认为false。当为true时,会移除所有数据
@CacheEvict(cacheNames="books", allEntries=true)
public void loadBooks(InputStream batch)
beforeInvocation:⾮必需,默认为false,会在调⽤⽅法之后移除数据。当为true时,会在调⽤⽅法之前移除数据。@CacheEvict(cacheNames="books", beforeInvocation=true)
public void loadBooks(InputStream batch)