声明式缓存的配置示例
声明式缓存配置的好处
1)将缓存功能从应用程序的核心需求中分离出来
2)设计决策的后期绑定,可以达到仅在开发人员确实需要的时候才允许他们为应用程序添加缓存的目的,而且不需要进行系统级的更改。
参考示例运行环境
Jdk5.0,Spring-2.5,Spring-modules-0.9,ehcache-1.6.0-beta4.jar
Spring配置文件
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
5
6 <!-- Using a EHCache cache manager -->
7 <bean id="cacheManager"
8 class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
9 <!--<property name="cacheManagerName" value="mainCache"/>-->
10 <property name="configLocation" value="classpath:ehcache.xml" />
11 </bean>
12
13 <!-- 使用Spring Modules对 EhCache的封装 -->
14 <bean id="cacheProviderFacade" class="org.springmodules.cache.provider.ehcache.EhCacheFacade">
15 <property name="cacheManager" ref="cacheManager" />
16 </bean>
17
18 <!-- 配置 方法 拦截器 -->
19 <!-- 缓存拦截器 -->
20 <bean id="cachingInterceptor"
21 class="org.springmodules.cache.interceptor.caching.MethodMapCachingInterceptor">
22 <property name="cacheProviderFacade" ref="cacheProviderFacade" />
23 <property name="cachingModels"> <!-- 进行cache缓存 -->
24 <props> <!-- 所有StudentService对象中,以get开头的方法都将进行缓存 -->
25 <prop key="StudentService.get*">cacheName=testCache</prop>
26 </props>
27 </property>
28 </bean>
29
30 <!-- 缓存刷新拦截器 -->
31 <bean id="flushingInterceptor"
32 class="org.springmodules.cache.interceptor.flush.MethodMapFlushingInterceptor">
33 <property name="cacheProviderFacade" ref="cacheProviderFacade" />
34 <property name="flushingModels"><!-- 进行cache刷新(清除) -->
35 <props>
36 <prop key="StudentService.set*">cacheNames=testCache</prop>
37 </props>
38 </property>
39 </bean>
40
41 <!-- 配置 基于BeanName规则的动态代理封装 -->
42 <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
43 <property name="beanNames">
44 <list>
45 <value>studentService</value>
46 </list>
47 </property>
48 <property name="interceptorNames">
49 <list>
50 <value>cachingInterceptor</value>
51 <value>flushingInterceptor</value>
52 </list>
53 </property>
54 </bean>
55
56 <bean id="studentService" class="StudentService"></bean>
57 </beans>
EhCache配置文件
1 <ehcache>
2 <diskStore path="java.io.tmpdir" />
3 <defaultCache maxElementsInMemory="10000" eternal="false"
4 timeToIdleSeconds="2" timeToLiveSeconds="5" overflowToDisk="true"
5 maxElementsOnDisk="10000000" diskPersistent="false"
6 diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" />
7 <cache name="testCache" maxElementsInMemory="10000"
8 maxElementsOnDisk="1000" eternal="false" overflowToDisk="false"
9 diskSpoolBufferSizeMB="20" timeToIdleSeconds="60" timeToLiveSeconds="3600"
10 memoryStoreEvictionPolicy="LFU" />
11 </ehcache>
测试类代码
1 public class Test {
2
3 /**
4 * @param args
5 */
6 public static void main(String[] args) {
7 AbstractApplicationContext context;
8 context = new ClassPathXmlApplicationContext("classpath*:context.xml");
9 context.start();
10
11 StudentService ss = (StudentService) context.getBean("studentService");
12
13 String name;
14 System.out.println("第一次访问,没有缓存");
15 name = ss.getName();
16 System.out.println(name);
17 name = ss.getName("Mr");
18 System.out.println(name);
19
20 //use change not changed value
21 System.out.println("第二次访问,使用缓存");
22 ss.changeNameAndNotTellCache("Michael");
23 name = ss.getName();
24 System.out.println(name);
25
26 name = ss.getName("Mr");
27 System.out.println(name);
28
29 //update cache
30 System.out.println("清除缓存后,再次访问 ");
31 ss.setName("Michael");
32 name = ss.getName();
33 System.out.println(name);
34
35 name = ss.getName("Mr");
36 System.out.println(name);
37
38 context.close();
39 }
40
41 }
测试结果
第一次访问,没有缓存
matthew
Mr matthew
第二次访问,使用缓存
matthew
Mr matthew
清除缓存后,再次访问
Michael
Mr Michael
参考文档:
http://www.blogjava.net/xmatthew/archive/2010/04/22/319146.html

浙公网安备 33010602011771号