最近项目刚好用的spring版本是Spring3.1.M1 ,好像 spring3就开始有了对缓存的整合。其实底层的实现也就是上篇文件一样。
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
1 //将缓存保存进andCache,并使用参数中的userId加上一个字符串(这里使用方法名称)作为缓存的key
2 @Cacheable(value="andCache",key="#userId + 'findById'")
3 public SystemUser findById(String userId) {
4 SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);
5 return user ;
6 }
7 //将缓存保存进andCache,并当参数userId的长度小于32时才保存进缓存,默认使用参数值及类型作为缓存的key
8 @Cacheable(value="andCache",condition="#userId.length < 32")
9 public boolean isReserved(String userId) {
10 System.out.println("hello andCache"+userId);
11 return false;
12 }
@CacheEvict 支持如下几个参数:
value:缓存位置名称,不能为空,同上
key:缓存的key,默认为空,同上
condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL
allEntries:true表示清除value中的全部缓存,默认为false
//清除掉指定key的缓存
@CacheEvict(value="andCache",key="#user.userId + 'findById'") public void EvictUserRole(SystemUser user) { System.out.println("hello andCache delete"+user.getUserId()); }//清除掉全部缓存
@CacheEvict(value="andCache",allEntries=true) public final void EvictUsers(String[] reservedUsers) { System.out.println("hello andCache deleteall"); }Spring3集成了ehcache缓存。
第一步:配置Spring文件,声明支持缓存和支持注解
13 <?xml version="1.0" encoding="UTF-8"?>
14 <beans xmlns="http://www.springframework.org/schema/beans"
15 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
16 xmlns:cache="http://www.springframework.org/schema/cache"
17 xsi:schemaLocation="
18 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
19 http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">
20
21 <!-- 缓存注解声明,使用注解缓存 -->
22 <cache:annotation-driven cache-manager="cacheManager" />
23
24 <!-- 指定ehcache.xml的位置 -->
25 <bean id="cacheManagerFactory"
26 class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
27 p:configLocation="classpath:/ehcache.xml" />
28
29 <!-- 声明缓存Manager -->
30 <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
31 p:cacheManager-ref="cacheManagerFactory" />
32
33 </beans>
第二步:配置Ehcache文件,定义缓存的具体策略。
34
35
36 <?xml version="1.0" encoding="UTF-8"?>
37
38
39
40
41
42 <ehcache>
43
44
45 <diskStore path="java.io.tmpdir" />
46
47
48 <defaultCache maxElementsInMemory="500" eternal="false"
49
50
51 timeToIdleSeconds="300" timeToLiveSeconds="1200" overflowToDisk="true" />
52
53
54 <cache name="DEFAULT_CACHE" maxElementsInMemory="5000" eternal="false"
55
56
57 timeToIdleSeconds="500" timeToLiveSeconds="500" overflowToDisk="true" />
58
59
60 </ehcache>
61
62
第三步:写一个使用缓存的测试方法:
63 import org.springframework.cache.annotation.Cacheable;
64 //将缓存保存进DEFAULT_CACHE,并使用参数中的userId加上一个字符串(这里使用方法名称)作为缓存的key
65 @Cacheable(value="DEFAULT_CACHE",key="#userId + 'findById'")
66 public SystemUser findById(String userId) {
67 SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);
68 return user ;
69 }
70
在这里,value = “”,对应了ehcache中的缓存名。
这种写法spring的缓存框架是根据传入进去的参数来判断查找缓存的,比如这里的param等于“admin”,缓存后,spring在从ehcache查“admin” 从缓存中取了。
如果你想更自主的控制缓存查找,可以使用key参数。
key使用SPEL语言(Spring开发的类似于jsp中的EL表达式的语言)。Key的默认生成如下:
1. 不提供参数,返回0
2. 只提供一个参数,直接返回该参数
3. 提供多个参数,则返回多个参数进行hash运算之后的结果。
总结:其实spring3的这个cache底层的实现就是和这里一样
只是spring帮我们封装好了。当然spring封装的还是比较好的。