有添加,就有清除缓存。
@Cacheable 不能直接设置过期时间,要结合@CacheConfig使用来设置过期时间
功能说明
@Cacheable 注解使用在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。
注意,这里强调了一点:参数相同。这一点应该是很容易理解的,因为缓存不关心方法的执行逻辑,它能确定的是:对于同一个方法,如果参数相同,那么返回结果也是相同的。但是如果参数不同,缓存只能假设结果是不同的,所以对于同一个方法,你的程序运行过程中,使用了多少种参数组合调用过该方法,理论上就会生成多少个缓存的 key(当然,这些组合的参数指的是与生成 key 相关的)。下面来了解一下 @Cacheable 的一些参数:
属性说明
value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cache的name
key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL
condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL
缓存名的属性
@Cacheable 提供两个参数来指定缓存名:value(可省略不写,默认)、cacheNames,二者选其一即可。
@Override
@Cacheable("menu")
public Menu findById(String id) {
Menu menu = this.getById(id);
if (menu != null){
System.out.println("menu.name = " + menu.getName());
}
return menu;
}
在这个例子中,findById 方法与一个名为 menu 的缓存关联起来了。调用该方法时,会检查 menu 缓存,如果缓存中有结果,就不会去执行方法了。
扩展:
其实,按照官方文档,@Cacheable 支持同一个方法关联多个缓存。这种情况下,当执行方法之前,这些关联的每一个缓存都会被检查,而且只要至少其中一个缓存命中了,那么这个缓存中的值就会被返回。
@Cacheable({“menu”, “menuById”})
区分同名方法的属性
一个缓存名对应一个被注解的方法,但是一个方法可能传入不同的参数,那么结果也就会不同。
比如:
使用@Cacheable(“menu”),由于我的参数值是不同的,比如第一次传入age为11,会有一个缓存,名字叫做menu,那第二次传入age为22,也会有一个叫做的menu缓存,那如何区分呢?就用key属性区分。
具体使用
@Cacheable(value = {“menuById”}, key = “#id”)
缓存结果以一个键值对存放在缓存中,注解中key即为键值对的key;value即为方法返回的结果
格式:#加上方法里面拿到参数名
@Cacheable(value="andCache",key="#userId + 'findById'")
public SystemUser findById(String userId) {
SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);
return user ;
}
@Override
@Cacheable(value = {"menuById"}, key = "#id")
public Menu findById(String id) {
Menu menu = this.getById(id);
if (menu != null){
System.out.println("menu.name = " + menu.getName());
}
return menu;
}
@Override
@Cacheable(value = {"menuById"}, key = "'id-' + #menu.id")
public Menu findById(Menu menu) {
return menu;
}
@Override
@Cacheable(value = {"menuById"}, key = "'hash' + #menu.hashCode()")
public Menu findByHash(Menu menu) {
return menu;
}
```
### 触发条件的属性
condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL
```
//将缓存保存进andCache,并当参数userId的长度小于32时才保存进缓存,默认使用参数值及类型作为缓存的key
@Cacheable(value="andCache",condition="#userId.length < 32")
public boolean isReserved(String userId) {
System.out.println("hello andCache"+userId);
return false;
}
```