Spring为我们提供了几个注解来支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略。值得注意的是跟AOP一样,缓存类内部方法直接调用的话,缓存是不生效的。
@Cacheable的属性非常多,这里介绍一般经常使用的属性;
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Cacheable { @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 ""; String unless() default ""; boolean sync() default false; }
-- value属性指定Cache名称,看得出来这是个数组,意味着我们可以将他存在不同的Cache下面。当然这也是必须给出的。
-- key如果我们不给的话,很明显keyGenerator() 会调用生成器,帮助我们生产,一般不需要关注;这里介绍是因为有时候我们需要自定义key值,如:
@Cacheable(value="cache_loyalty_appliers", key="#id")
自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例。
@Cacheable(value="cache_loyalty", key="#id")
public List
@Cacheable(value="cache_loyalty", key="#p0")
public List
@Cacheable(value="cache_loyalty", key="#la.id")
public List
@Cacheable(value="cache_loyalty", key="#p0.id")
public List
-- condition属性指定条件如下:指定东西属性为偶数是才会触发缓存
@Cacheable(value={"cache_loyalty"}, key="#la.id", condition="#la.age%2 == 0 ")
在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
@CachePut(value = "names", key = "'names:' + #name")//每次都会执行方法,并将结果存入指定的缓存中
public Hello update(String name) {
.....
return hello;
}
@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。
@CacheEvict(value = "names", key = "'names:' + #name")//删除缓存
public Hello delete(String name) {
........
return hello;
}
@CacheEvict 有2个比较重要的属性
allEntries beforeInvocation
allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素。
@CacheEvict(value="la", allEntries=true)
public void delete(String id) 。。。
清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。
@CacheEvict(value="la", beforeInvocation=true)
public void delete(String id)