目录
简单介绍使用Spring框架Cacheable
一、相关注解
1、@Cacheable注解
可以标记在一个方法上,也可以标记在一个类上。@Cacheable可以指定三个属性,value、key和condition。
value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组。
key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。
condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。如下示例表示只有当user的id为偶数时才会进行缓存。如 @Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
2、@CachePut
@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
3、@CacheEvict
@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。
@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。
二、案例代码
1、service层代码
@Service
public class PersonService {
@Cacheable(value = "personCache")
public Person getPersonByName(String name) {
// 方法内部实现不考虑缓存逻辑,直接实现业务
System.out.println("调用了Service方法");
return getFromDB(name);
}
private Person getFromDB(String name) {
System.out.println("从数据库查询了");
return new Person();
}
}
2、配置CacheManager
<context:component-scan base-package="demo06"/>
<cache:annotation-driven />
<bean id="cacheManager" class="org.springframewo