首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

spring 三 缓存

2012-09-29 
spring 3 缓存下面简单介绍一下spring3.1.M1中的cache功能。spring3.1.M1中负责cache的模块是org.springfra

spring 3 缓存

下面简单介绍一下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'")
public SystemUser findById(String userId) {
SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);
return user ;
}
//将缓存保存进andCache,并当参数userId的长度小于32时才保存进缓存,默认使用参数值及类型作为缓存的key
@Cacheable(value="andCache",condition="#userId.length < 32")
public boolean isReserved(String userId) {
System.out.println("hello andCache"+userId);
return false;
}

?

@CacheEvict 支持如下几个参数:

value:缓存位置名称,不能为空,同上

key:缓存的key,默认为空,同上

condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL

allEntries:true表示清除value中的全部缓存,默认为false

?

例如:

?

//清除掉指定key的缓存
@CacheEvict(value="andCache",key="#user.userId + 'findById'")
public void modifyUserRole(SystemUser user) {
System.out.println("hello andCache delete"+user.getUserId());
}

&nbsp;//清除掉全部缓存
@CacheEvict(value="andCache",allEntries=true)
public final void setReservedUsers(String[] reservedUsers) {
System.out.println("hello andCache deleteall");
}

一般来说,我们的更新操作只需要刷新缓存中某一个值,所以定义缓存的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的配置

Xml代码 spring 三 缓存
    <beans?xmlns="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/beans?http://www.springframework.org/schema/beans/spring-beans-3.1.xsd????????????http://www.springframework.org/schema/cache?http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">
<beans xmlns="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/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">

?

之后添加如下声明:

Xml代码 spring 三 缓存
    ??????<!--?启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效?--><cache:annotation-driven?cache-manager="cacheManager"/><!--?spring自己的换管理器,这里定义了两个缓存位置名称?,既注解中的value?--><bean?id="cacheManager"?/><bean/></set></property></bean>

    ?

    2.spring-ehcache

    接下来说说对ehcache的支持,其实只需要把cacheManager换成EHCache的cacheManager即可,如下:

    Java代码 spring 三 缓存
      ???????<!--?启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效?--><cache:annotation-driven?cache-manager="cacheManager"/><!--?cacheManager工厂类,指定ehcache.xml的位置?--><bean?id="cacheManagerFactory"?/> <!-- 声明cacheManager --><bean id="cacheManager"p:cacheManager-ref="cacheManagerFactory" />

      ?ehcache.xml

      Xml代码 spring 三 缓存
        <?xml?version="1.0"?encoding="UTF-8"?><ehcache?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"????xsi:noNamespaceSchemaLocation="ehcache.xsd"?updateCheck="true"????monitoring="autodetect">????<!--????<diskStore?path="java.io.tmpdir"?/>?-->????<diskStore?path="E:/cachetmpdir"/>????<defaultCache?maxElementsInMemory="10000"?eternal="false"????????timeToIdleSeconds="120"?timeToLiveSeconds="120"?overflowToDisk="true"????????maxElementsOnDisk="10000000"?diskPersistent="false"????????diskExpiryThreadIntervalSeconds="120"?memoryStoreEvictionPolicy="LRU"?/>????<cache?name="andCache"?maxElementsInMemory="10000"????????maxElementsOnDisk="1000"?eternal="false"?overflowToDisk="true"????????diskSpoolBufferSizeMB="20"?timeToIdleSeconds="300"?timeToLiveSeconds="600"????????memoryStoreEvictionPolicy="LFU"?/></ehcache>
      <?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"monitoring="autodetect"><!--<diskStore path="java.io.tmpdir" /> --><diskStore path="E:/cachetmpdir"/><defaultCache maxElementsInMemory="10000" eternal="false"timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"maxElementsOnDisk="10000000" diskPersistent="false"diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /><cache name="andCache" maxElementsInMemory="10000"maxElementsOnDisk="1000" eternal="false" overflowToDisk="true"diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600"memoryStoreEvictionPolicy="LFU" /></ehcache>

      ?

      ?

      ok,这样注解缓存就生效了。

热点排行