借助Spring Module项目,如何配置声明式缓存功能实现

借助Spring Module项目,如何配置声明式缓存功能实现

 前言:
本文档将讲解一下,如何借助Spring Module项目,实现配置声明性缓存功能。
说明:
本档的配置经过本人测试,都能正确运行。
运行环境: Jdk5.0, Spring-2.5, Spring-modules-0.9, ehcache-1.6.0-beta4.jar

首先创建一个StudentService服务类,本文将对其所有的以get* 方式命令的方法,进行缓存处理。当调用set* 命令时,需要其删除缓存
以更做数据的更新。
源代码如下:

1   public   class  StudentService  {
 
2 
 
3     private String name = "matthew";
 
4     
 
5     public String getName() {
 
6         return name;
 
7     }

 
8     
 
9     public String getName(String salution) {
10         return salution + " " + name;
11     }

12     
13     public void setName(String name) {
14         this.name = name;
15     }

16     
17     public void changeNameAndNotTellCache(String name) {
18         this.name = name;
19     }

20 }


接下来,就是编写Spring配置文件 context.xml,以实现根据上面的要求,进行声明性缓存功能的配置
Spring的配置内容如下:(已加上注释)

<? 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能正常工作,还得编写EhCache配置文件 ehcache.xml, 内容如下:

 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 >


下面将要测试配置是否能正确工作,编写一个测试类 Test.java内容如下:

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

从输出的结果上来看,缓存的功能已经正确启效。
本文只是一个简单的示例,希望对大家有借鉴作用。
更多的资料,详见官方文档 https://springmodules.dev.java.net/.

http://www.blogjava.net/xmatthew/archive/2010/04/22/319146.html

你可能感兴趣的:(借助Spring Module项目,如何配置声明式缓存功能实现)