考虑两方面:
i) 声明某些方法使用缓存(注解方式)
ii) 配置Spring对Cache的支持。
一、基于注解的支持
一般我们常用的注解:@Cacheable和@CacheEvict。
1.1、@Cacheable
@Cacheable既可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记一个类上时则表示该类所有的方法都是支持缓存的。
它有三个属性:value、key和condition
1、value属性(必须的)
指定Cache名称,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。可以是一个也可以是多个,当指定多个时其是一个数组。
2、key属性(可选,有默认)
是用来指定Spring缓存方法的返回结果时对应的key。当我们没有指定该属性时,Spring将使用默认策略生成key。
自定义策略是指可以通过Spring的EL表达式来指定key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时直接使用“#参数名”或者“#p参数index”
3、condition(可选,默认为空,表示将缓存所有的调用情形)
指明该方法的返回结果是否被缓存。
总结:
当执行到一个被@Cacheable注解的方法时,Spring首先检查condition条件是否满足。
如果不满足,执行方法,返回;
如果满足,在value所命令的缓存空间中查找使用key存储的对象,如果找到,将找到的结果返回,如果没有找到执行方法,将方法的返回值以key-对象的方式存入value缓存中,然后方法返回。
二、配置Spring对Cache的支持
1、xml文件中增加命名空间
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,有一个cache-manager属性用来指定当前所使用的CacheManager对应的bean的名称,默认是cacheManager --> <cache:annotation-driven/> </beans>
<cache:annotation-driven/>有一个cache-manager属性用来指定当前所使用的CacheManager对应的bean的名称,默认是cacheManager
2、配置CacheManager
CacheManager是Spring定义的一个用来管理Cache的接口。Spring自身已经为我们提供了两种CacheManager的实现。一种是基于Java API的ConcurrentMap,另一种是基于第三方Cache实现--EhCache.。
基于ConcurrentMap的配置
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"> <property name="caches"> <set> <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"> <!--xxxx对应@Cacheable中的value值--> <property name="name" value="xxxx"/> </bean> </set> </property></bean>
完成以上步骤后,可进行测试下。
第一次调用时,走其中的方法,第二次不走其中方法,直接从缓存中抽取.