Spring@Cacheable注解中key详解
key属性是⽤来指定Spring缓存⽅法的返回结果时对应的key的。该属性⽀持SpringEL表达式。当我们没有指定该属性时,Spring将使⽤默认策略⽣成key。我们这⾥先来看看⾃定义策略,⾄于默认策略会在后⽂单独介绍。
⾃定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这⾥的EL表达式可以使⽤⽅法参数及它们对应的属性。使⽤⽅法参数时我们可以直接使⽤“#参数名”或者“#p参数index”。下⾯是⼏个使⽤参数作为key的⽰例。
@Cacheable(value="users", key="#id")
public User find(Integer id) {
returnnull;
}
@Cacheable(value="users", key="#p0")
public User find(Integer id) {
returnnull;
}
@Cacheable(value="users", key="#user.id")
public User find(User user) {
returnnull;
}
@Cacheable(value="users", key="#p0.id")
public User find(User user) {
returnnull;
}
除了上述使⽤⽅法参数作为key之外,Spring还为我们提供了⼀个root对象可以⽤来⽣成key。通过该root对象我们可以获取到以下信息。
当我们要使⽤root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使⽤的就是root对象的属性。如:
@Cacheable(value={"users", "xxx"}, key="caches[1].name")
public User find(User user) {
returnnull;
}
如果要调⽤当前类⾥⾯的⽅法
@Override
@Cacheable(value={"TeacherAnalysis_public_chart"}, key="#DictTableName() + '_' + #FieldName()")
public List<Map<String, Object>> getChartList(Map<String, Object> paramMap) {
}
public String getDictTableName(){
return "";
}
public String getFieldName(){
return "";
}
condition属性指定发⽣的条件
有的时候我们可能并不希望缓存⼀个⽅法所有的返回结果。通过condition属性可以实现这⼀功能。condition属性默认为空,表⽰将缓存所有的调⽤情形。其值是通过SpringEL表达式来指定的,当为true时表⽰进⾏缓存处理;当为false时表⽰不进⾏缓存处理,即每次调⽤该⽅法时该⽅法都会执⾏⼀次。如下⽰例表⽰只有当user的id为偶数时才会进⾏缓存
@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
public User find(User user) {
System.out.println("find user by user " + user);
return user;
}
@CachePut
在⽀持Spring Cache的环境下,对于使⽤@Cacheable标注的⽅法,Spring在每次执⾏前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执⾏该⽅法,⽽是直接从缓存中获取结果进⾏返回,否则才会执⾏并将返回结果存⼊指定的缓存中。@CachePut也可以声明⼀个⽅法⽀持缓存功能。
与@Cacheable不同的是使⽤@CachePut标注的⽅法在执⾏前不会去检查缓存中是否存在之前执⾏过的结果,⽽是每次都会执⾏该⽅法,并将执⾏结果以键值对的形式存⼊指定的缓存中。
@CachePut也可以标注在类上和⽅法上。使⽤@CachePut时我们可以指定的属性跟@Cacheable是⼀样的。
@CachePut("users")//每次都会执⾏⽅法,并将结果存⼊指定的缓存中
public User find(Integer id) {
return null;
}
@CacheEvict
@CacheEvict是⽤来标注在需要清除缓存元素的⽅法或类上的。当标记在⼀个类上时表⽰其中所有的⽅法的执⾏都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与
@Cacheable对应的属性类似。即value表⽰清除操作是发⽣在哪些Cache上的(对应Cache的名称);key表⽰需要清除的是哪个key,如未指定则会使⽤默认策略⽣成的key;condition表⽰清除操作发⽣的条件。下⾯我们来介绍⼀下新出现的两个属性allEntries和beforeInvocation。
allEntries属性
allEntries是boolean类型,表⽰是否需要清除缓存中的所有元素。默认为false,表⽰不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache⼀下清除所有的元素,这⽐⼀个⼀个清除元素更有效率。
@CacheEvict(value="users", allEntries=true)
public void delete(Integer id) {
System.out.println("delete user by id: " + id);
}
beforeInvocation属性
清除操作默认是在对应⽅法成功执⾏之后触发的,即⽅法如果因为抛出异常⽽未能成功返回时也不会触发清除操作。使⽤beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调⽤该⽅法之前清除缓存中的指定元素。
@CacheEvict(value="users", beforeInvocation=true)
public void delete(Integer id) {
System.out.println("delete user by id: " + id);
}
其实除了使⽤@CacheEvict清除缓存元素外,当我们使⽤Ehcache作为实现时,我们也可以配置Ehcache⾃⾝的驱除策略,其是通过Ehcache的配置⽂件来指定的。由于Ehcache不是本⽂描述的重点,这⾥就不多赘述了,想了解更多关于Ehcache的信息,请查看我关于Ehcache的专栏。
@Caching
@Caching注解可以让我们在⼀个⽅法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别⽤于指定@Cacheable、@CachePut和@CacheEvict。
@Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),
@CacheEvict(value = "cache3", allEntries = true) })
public User find(Integer id) {
el表达式获取map的值return null;
}
使⽤⾃定义注解
Spring允许我们在配置可缓存的⽅法时使⽤⾃定义的注解,前提是⾃定义的注解上必须使⽤对应的注解进⾏标注。如我们有如下这么⼀个使⽤@Cacheable进⾏标注的⾃定义注解。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Cacheable(value="users")
public @interface MyCacheable {
}
那么在我们需要缓存的⽅法上使⽤@MyCacheable进⾏标注也可以达到同样的效果
@MyCacheable
public User findById(Integer id) {
System.out.println("find user by id: " + id);
User user = new User();
user.setId(id);
user.setName("Name" + id);
return user;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论