Spring3.1 Cache注解
下面简单介绍一下spring3.1.M1中的cache功能。
spring3.1.M1中负责cache的模块是org.springframework.context-3.1.0.M1.jar
与2.5时的modules模块类似,3.1的注解缓存也是在方法上声明注解,3.1同样提供了两个注解:
@Cacheable:负责将方法的返回值加入到缓存中
@CacheEvict:负责清除缓存
@Cacheable支持如下几个参数:
value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cache的name
key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL
condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL
例如:
- //将缓存保存进andCache,并使用参数中的userId加上一个字符串(这里使用方法名称)作为缓存的key
- @Cacheable(value="andCache",key="#userId+'findById'")
- publicSystemUserfindById(StringuserId){
- SystemUseruser=(SystemUser)dao.findById(SystemUser.class,userId);
- returnuser;
- }
- //将缓存保存进andCache,并当参数userId的长度小于32时才保存进缓存,默认使用参数值及类型作为缓存的key
- @Cacheable(value="andCache",condition="#userId.length<32")
- publicbooleanisReserved(StringuserId){
- System.out.println("helloandCache"+userId);
- returnfalse;
- }
@CacheEvict支持如下几个参数:
value:缓存位置名称,不能为空,同上
key:缓存的key,默认为空,同上
condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL
allEntries:true表示清除value中的全部缓存,默认为false
例如:
- //清除掉指定key的缓存
- @CacheEvict(value="andCache",key="#user.userId+'findById'")
- publicvoidmodifyUserRole(SystemUseruser){
- System.out.println("helloandCachedelete"+user.getUserId());
- }
- //清除掉全部缓存
- @CacheEvict(value="andCache",allEntries=true)
- publicfinalvoidsetReservedUsers(String[]reservedUsers){
- System.out.println("helloandCachedeleteall");
- }
一般来说,我们的更新操作只需要刷新缓存中某一个值,所以定义缓存的key值的方式就很重要,最好是能够唯一,因为这样可以准确的清除掉特定的缓存,而不会影响到其它缓存值,
比如我这里针对用户的操作,使用(userId+方法名称)的方式设定key值,当然,你也可以找到更适合自己的方式去设定。
SpEL:Spring Expression Language
关于SpEL的介绍,可以参考如下地址:
http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/expressions.html
了解了cache的注解之后,接下来说说如何使注解生效,其实就是需要在spring的配置文件中增加一些配置。
1.spring-cache
首先我们来看一下如何使用spring3.1自己的cache,
需要在命名空间中增加cache的配置
- <beansxmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
- xmlns:cache="http://www.springframework.org/schema/cache"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd
- http://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache-3.1.xsd">
之后添加如下声明:
- <!--启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效-->
- <cache:annotation-drivencache-manager="cacheManager"/>
- <!--spring自己的换管理器,这里定义了两个缓存位置名称,既注解中的value-->
- <beanid="cacheManager"class="org.springframework.cache.support.SimpleCacheManager">
- <propertyname="caches">
- <set>
- <bean
- class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"
- p:name="default"/>
- <bean
- class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"
- p:name="andCache"/>
- </set>
- </property>
- </bean>
2.spring-ehcache
接下来说说对ehcache的支持,其实只需要把cacheManager换成EHCache的cacheManager即可,如下:
- <!--启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效-->
- <cache:annotation-drivencache-manager="cacheManager"/>
- <!--cacheManager工厂类,指定ehcache.xml的位置-->
- <beanid="cacheManagerFactory"class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
- p:configLocation="classpath:/config/ehcache.xml"/>
- <!--声明cacheManager-->
- <beanid="cacheManager"class="org.springframework.cache.ehcache.EhCacheCacheManager"
- p:cacheManager-ref="cacheManagerFactory"/>
ehcache.xml
- <?xmlversion="1.0"encoding="UTF-8"?>
- <ehcachexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:noNamespaceSchemaLocation="ehcache.xsd"updateCheck="true"
- monitoring="autodetect">
- <!--
- <diskStorepath="java.io.tmpdir"/>-->
- <diskStorepath="E:/cachetmpdir"/>
- <defaultCachemaxElementsInMemory="10000"eternal="false"
- timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="true"
- maxElementsOnDisk="10000000"diskPersistent="false"
- diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"/>
- <cachename="andCache"maxElementsInMemory="10000"
- maxElementsOnDisk="1000"eternal="false"overflowToDisk="true"
- diskSpoolBufferSizeMB="20"timeToIdleSeconds="300"timeToLiveSeconds="600"
- memoryStoreEvictionPolicy="LFU"/>
- </ehcache>
ok,这样注解缓存就生效了。
附件中是我自己写的一个小例子,工程结构如下所示,运行com.piaoyi.function.demo下的DemoTest即可
参考资料:
http://blog.springsource.com/2011/02/23/spring-3-1-m1-caching/
http://hi.baidu.com/coolcooldool/blog/item/3b541533c72b40e21a4cffda.html