首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring集成Ehcache[收拾]

2012-07-19 
Spring集成Ehcache[整理]http://blog.csdn.net/upyaya/archive/2007/05/21/1619411.aspx原文地址:http://o

Spring集成Ehcache[整理]

http://blog.csdn.net/upyaya/archive/2007/05/21/1619411.aspx

原文地址:
http://opensource.atlassian.com/confluence/spring/display/DISC/Caching+the+result+of+methods+using+Spring+and+EHCache导言从 Spring 1.1.1 开始,EHCache 就作为一种通用缓存解决方案集成进 Spring。我将示范拦截器的例子,它能把方法返回的结果缓存起来。?利用 Spring IoC 配置 EHCache在 Spring 里配置 EHCache 很简单。你只需一个 ehcache.xml 文件,该文件用于配置 EHCache:Spring集成Ehcache[收拾]<ehcache>
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????<!—设置缓存文件?.data?的创建路径。
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]?????????如果该路径是?Java?系统参数,当前虚拟机会重新赋值。
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]?????????下面的参数这样解释:
Spring集成Ehcache[收拾]?????????user.home?–?用户主目录
Spring集成Ehcache[收拾]?????????user.dir??????–?用户当前工作目录
Spring集成Ehcache[收拾]?????????java.io.tmpdir?–?默认临时文件路径?-->
Spring集成Ehcache[收拾]????<diskStore?path="java.io.tmpdir"/>
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????<!—缺省缓存配置。CacheManager?会把这些配置应用到程序中。
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????????下列属性是?defaultCache?必须的:
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????????maxInMemory???????????-?设定内存中创建对象的最大值。
Spring集成Ehcache[收拾]????????eternal????????????????????????-?设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超
Spring集成Ehcache[收拾]??????????????????????????????????????????????时限制且元素永不消亡。
Spring集成Ehcache[收拾]????????timeToIdleSeconds??-?设置某个元素消亡前的停顿时间。
Spring集成Ehcache[收拾]??????????????????????????????????????????????也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。
Spring集成Ehcache[收拾]??????????????????????????????????????????????这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则
Spring集成Ehcache[收拾]??????????????????????????????????????????????设置该属性也无用)。
Spring集成Ehcache[收拾]??????????????????????????????????????????????如果该值是?0?就意味着元素可以停顿无穷长的时间。
Spring集成Ehcache[收拾]????????timeToLiveSeconds?-?为元素设置消亡前的生存时间。
Spring集成Ehcache[收拾]???????????????????????????????????????????????也就是一个元素从构建到消亡的最大时间间隔值。
Spring集成Ehcache[收拾]???????????????????????????????????????????????这只能在元素不是永久驻留时有效。
Spring集成Ehcache[收拾]????????overflowToDisk????????-?设置当内存中缓存达到?maxInMemory?限制时元素是否可写到磁盘
Spring集成Ehcache[收拾]???????????????????????????????????????????????上。
Spring集成Ehcache[收拾]????????-->
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????<cache?name="org.taha.cache.METHOD_CACHE"
Spring集成Ehcache[收拾]????????maxElementsInMemory="300"
Spring集成Ehcache[收拾]????????eternal="false"
Spring集成Ehcache[收拾]????????timeToIdleSeconds="500"
Spring集成Ehcache[收拾]????????timeToLiveSeconds="500"
Spring集成Ehcache[收拾]????????overflowToDisk="true"
Spring集成Ehcache[收拾]????????/>
Spring集成Ehcache[收拾]</ehcache>

拦截器将使用 ”org.taha.cache.METHOD_CACHE” 区域缓存方法返回结果。下面利用 Spring IoC 让 bean 来访问这一区域。

Spring集成Ehcache[收拾]<!--?======================???缓存???=======================?-->
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]<bean?id="cacheManager"?class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
Spring集成Ehcache[收拾]??<property?name="configLocation">
Spring集成Ehcache[收拾]????<value>classpath:ehcache.xml</value>
Spring集成Ehcache[收拾]??</property>
Spring集成Ehcache[收拾]</bean>
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]<bean?id="methodCache"?class="org.springframework.cache.ehcache.EhCacheFactoryBean">
Spring集成Ehcache[收拾]??<property?name="cacheManager">
Spring集成Ehcache[收拾]????<ref?local="cacheManager"/>
Spring集成Ehcache[收拾]??</property>
Spring集成Ehcache[收拾]??<property?name="cacheName">
Spring集成Ehcache[收拾]????<value>org.taha.cache.METHOD_CACHE</value>
Spring集成Ehcache[收拾]??</property>
Spring集成Ehcache[收拾]</bean>

?

构建我们的 MethodCacheInterceptor该拦截器实现org.aopalliance.intercept.MethodInterceptor接口。一旦运行起来(kicks-in),它首先检查被拦截方法是否被配置为可缓存的。这将可选择性的配置想要缓存的 bean 方法。只要调用的方法配置为可缓存,拦截器将为该方法生成 cache key 并检查该方法返回的结果是否已缓存。如果已缓存,就返回缓存的结果,否则再次调用被拦截方法,并缓存结果供下次调用。?com.ph.serviceportal.infoboard.util.MethodCacheInterceptor?Spring集成Ehcache[收拾]package?com.ph.serviceportal.infoboard.util;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]import?java.io.Serializable;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]import?net.sf.ehcache.Cache;
Spring集成Ehcache[收拾]import?net.sf.ehcache.Element;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]import?org.aopalliance.intercept.MethodInterceptor;
Spring集成Ehcache[收拾]import?org.aopalliance.intercept.MethodInvocation;
Spring集成Ehcache[收拾]import?org.apache.commons.logging.Log;
Spring集成Ehcache[收拾]import?org.apache.commons.logging.LogFactory;
Spring集成Ehcache[收拾]import?org.springframework.beans.factory.InitializingBean;
Spring集成Ehcache[收拾]import?org.springframework.util.Assert;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]public?class?MethodCacheInterceptor?implements?MethodInterceptor,
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????????InitializingBean?...{
Spring集成Ehcache[收拾]????private?static?final?Log?logger?=?LogFactory
Spring集成Ehcache[收拾]????????????.getLog(MethodCacheInterceptor.class);
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????private?Cache?cache;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????public?void?setCache(Cache?cache)?...{
Spring集成Ehcache[收拾]????????this.cache?=?cache;
Spring集成Ehcache[收拾]????}
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????/**?*//**?
Spring集成Ehcache[收拾]?????*??
Spring集成Ehcache[收拾]?????*/
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????public?MethodCacheInterceptor()?...{
Spring集成Ehcache[收拾]????????super();
Spring集成Ehcache[收拾]????????//?TODO?自动生成构造函数存根??
Spring集成Ehcache[收拾]????}
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????/**?*//**?
Spring集成Ehcache[收拾]?????*?主方法?
Spring集成Ehcache[收拾]?????*?如果某方法可被缓存就缓存其结果?
Spring集成Ehcache[收拾]?????*?方法结果必须是可序列化的(serializable)?
Spring集成Ehcache[收拾]?????*/
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????public?Object?invoke(MethodInvocation?invocation)?throws?Throwable?...{
Spring集成Ehcache[收拾]????????String?targetName?=?invocation.getThis().getClass().getName();
Spring集成Ehcache[收拾]????????String?methodName?=?invocation.getMethod().getName();
Spring集成Ehcache[收拾]????????Object[]?arguments?=?invocation.getArguments();
Spring集成Ehcache[收拾]????????Object?result;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????????logger.debug("在缓存中查找方法返回的对象!");
Spring集成Ehcache[收拾]????????String?cacheKey?=?getCacheKey(targetName,?methodName,?arguments);
Spring集成Ehcache[收拾]????????Element?element?=?cache.get(cacheKey);
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????????if?(element?==?null)?...{
Spring集成Ehcache[收拾]????????????logger.debug("正在拦截方法!");
Spring集成Ehcache[收拾]????????????result?=?invocation.proceed();
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????????????logger.debug("正在缓存对象!");
Spring集成Ehcache[收拾]????????????element?=?new?Element(cacheKey,?(Serializable)result);
Spring集成Ehcache[收拾]????????????cache.put(element);
Spring集成Ehcache[收拾]????????}
Spring集成Ehcache[收拾]????????return?element.getValue();
Spring集成Ehcache[收拾]????}
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????/**?*//**?
Spring集成Ehcache[收拾]?????*创建一个缓存对象的标识:?targetName.methodName.argument0.argument1...?
Spring集成Ehcache[收拾]?????*/
Spring集成Ehcache[收拾]????private?String?getCacheKey(String?targetName,?String?methodName,
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????????????Object[]?arguments)?...{
Spring集成Ehcache[收拾]????????StringBuffer?sb?=?new?StringBuffer();
Spring集成Ehcache[收拾]????????sb.append(targetName).append(".").append(methodName);
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????????if?((arguments?!=?null)?&&?(arguments.length?!=?0))?...{
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????????????for?(int?i?=?0;?i?<?arguments.length;?i++)?...{
Spring集成Ehcache[收拾]????????????????sb.append(".").append(arguments[i]);
Spring集成Ehcache[收拾]????????????}
Spring集成Ehcache[收拾]????????}
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????????return?sb.toString();
Spring集成Ehcache[收拾]????}
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????/**//*?(非?Javadoc)?
Spring集成Ehcache[收拾]?????*?@see?org.springframework.beans.factory.InitializingBeanafterPropertiesSet()?
Spring集成Ehcache[收拾]?????*/
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????public?void?afterPropertiesSet()?throws?Exception?...{
Spring集成Ehcache[收拾]????????Assert.notNull(cache,?"需要一个缓存.?使用setCache(Cache)分配一个.");
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????}
Spring集成Ehcache[收拾]}
Spring集成Ehcache[收拾]

? com.ph.serviceportal.infoboard.util.MethodCacheAfterAdvice?

?Spring集成Ehcache[收拾]package?com.ph.serviceportal.infoboard.util;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]import?java.lang.reflect.Method;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]import?net.sf.ehcache.Cache;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]import?org.springframework.aop.AfterReturningAdvice;
Spring集成Ehcache[收拾]import?org.springframework.beans.factory.InitializingBean;
Spring集成Ehcache[收拾]import?org.springframework.util.Assert;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]public?class?MethodCacheAfterAdvice?implements?AfterReturningAdvice,
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????????InitializingBean?...{
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????private?Cache?cache;
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????public?void?setCache(Cache?cache)?...{
Spring集成Ehcache[收拾]????????this.cache?=?cache;
Spring集成Ehcache[收拾]????}
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????/**?*//**
Spring集成Ehcache[收拾]?????*?
Spring集成Ehcache[收拾]?????*/
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????public?MethodCacheAfterAdvice()?...{
Spring集成Ehcache[收拾]????????super();
Spring集成Ehcache[收拾]????}
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????/**//*
Spring集成Ehcache[收拾]?????*?(非?Javadoc)
Spring集成Ehcache[收拾]?????*?
Spring集成Ehcache[收拾]?????*?@see?org.springframework.aop.AfterReturningAdviceafterReturning(java.lang.Object,
Spring集成Ehcache[收拾]?????*??????java.lang.reflect.Method,?java.lang.Object[],?java.lang.Object)
Spring集成Ehcache[收拾]?????*/
Spring集成Ehcache[收拾]????public?void?afterReturning(Object?arg0,?Method?arg1,?Object[]?arg2,
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????????????Object?arg3)?throws?Throwable?...{
Spring集成Ehcache[收拾]????????StringBuffer?buffer?=?new?StringBuffer();
Spring集成Ehcache[收拾]????????buffer.append(arg3.getClass().getName()).append(".").append(
Spring集成Ehcache[收拾]????????????????arg1.getName());
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????????if?(arg2?!=?null?&&?arg2.length?!=?0)?...{
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????????????for?(int?i?=?0;?i?<?arg2.length;?i++)?...{
Spring集成Ehcache[收拾]????????????????buffer.append(".").append(arg2[i]);
Spring集成Ehcache[收拾]????????????}
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]????????}
Spring集成Ehcache[收拾]????????cache.remove(buffer);
Spring集成Ehcache[收拾]????}
Spring集成Ehcache[收拾]
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????/**//*
Spring集成Ehcache[收拾]?????*?(非?Javadoc)
Spring集成Ehcache[收拾]?????*?
Spring集成Ehcache[收拾]?????*?@see?org.springframework.beans.factory.InitializingBeanafterPropertiesSet()
Spring集成Ehcache[收拾]?????*/
Spring集成Ehcache[收拾]Spring集成Ehcache[收拾]????public?void?afterPropertiesSet()?throws?Exception?...{
Spring集成Ehcache[收拾]????????Assert.notNull(cache,?"需要一个缓存.?使用setCache(Cache)分配一个.");
Spring集成Ehcache[收拾]????}
Spring集成Ehcache[收拾]}
Spring集成Ehcache[收拾]MethodCacheInterceptor 代码说明了:
    默认条件下,所有方法返回结果都被缓存了(methodNames 是 null) 缓存区利用 IoC 形成 cacheKey 的生成还包括方法参数的因素(译注:参数的改变会影响 cacheKey) 使用 MethodCacheInterceptor下面摘录了怎样配置 MethodCacheInterceptor and MethodCacheAfterAdvice:Spring集成Ehcache[收拾]<bean?id="methodCacheInterceptor"
    Spring集成Ehcache[收拾]????????class="com.ph.serviceportal.infoboard.util.MethodCacheInterceptor">
    Spring集成Ehcache[收拾]????????<property?name="cache">
    Spring集成Ehcache[收拾]????????????<ref?local="methodCache"?/>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????</bean>
    Spring集成Ehcache[收拾]????<bean?id="methodCacheAfterAdvice"
    Spring集成Ehcache[收拾]????????class="com.ph.serviceportal.infoboard.util.MethodCacheAfterAdvice">
    Spring集成Ehcache[收拾]????????<property?name="cache">
    Spring集成Ehcache[收拾]????????????<ref?local="methodCache"?/>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????</bean>
    Spring集成Ehcache[收拾]????<bean?id="methodCachePointCut"
    Spring集成Ehcache[收拾]????????class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    Spring集成Ehcache[收拾]????????<property?name="advice">
    Spring集成Ehcache[收拾]????????????<ref?local="methodCacheInterceptor"?/>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????????<property?name="patterns">
    Spring集成Ehcache[收拾]????????????<list>
    Spring集成Ehcache[收拾]????????????????<value>.*find.*</value>
    Spring集成Ehcache[收拾]????????????????<value>.*get.*</value>
    Spring集成Ehcache[收拾]????????????</list>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????</bean>
    Spring集成Ehcache[收拾]????<bean?id="methodCacheAdvicePointCut"
    Spring集成Ehcache[收拾]????????class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    Spring集成Ehcache[收拾]????????<property?name="advice">
    Spring集成Ehcache[收拾]????????????<ref?local="methodCacheAfterAdvice"?/>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????????<property?name="patterns">
    Spring集成Ehcache[收拾]????????????<list>
    Spring集成Ehcache[收拾]????????????????<value>.*upd.*</value>
    Spring集成Ehcache[收拾]????????????????<value>.*save.*</value>
    Spring集成Ehcache[收拾]????????????????<value>.*delete.*</value>
    Spring集成Ehcache[收拾]????????????</list>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????</bean>结合上一篇文章,我们有如下配置:?spring+JAX-RPC(Axis) 构建webserviceSpring集成Ehcache[收拾]????<bean?name="infoboardService"
    Spring集成Ehcache[收拾]????????class="com.ph.serviceportal.infoboard.service.InfoBoardServiceImpl">
    Spring集成Ehcache[收拾]????????<property?name="dataRetriever"?ref="infoboardDAO"?/>
    Spring集成Ehcache[收拾]????</bean>
    Spring集成Ehcache[收拾]
    Spring集成Ehcache[收拾]????<bean?name="infoboardDAO"
    Spring集成Ehcache[收拾]????????class="com.ph.serviceportal.infoboard.dao.InfoboardDAOImpl">
    Spring集成Ehcache[收拾]????????<property?name="infoboardDAO">
    Spring集成Ehcache[收拾]????????????<ref?local="infoboardServiceRpcProxy"?/>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????</bean>
    Spring集成Ehcache[收拾]
    Spring集成Ehcache[收拾]????<bean?id="infoboardServiceRpcProxy"
    Spring集成Ehcache[收拾]????????class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean">
    Spring集成Ehcache[收拾]????????<property?name="serviceInterface">
    Spring集成Ehcache[收拾]????????????<value>
    Spring集成Ehcache[收拾]????????????????com.hp.serviceportal.infoboard.dao.IInfoboardDAO
    Spring集成Ehcache[收拾]????????????</value>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????????<property?name="wsdlDocumentUrl">
    Spring集成Ehcache[收拾]????????????<value>
    Spring集成Ehcache[收拾]????????????????http://qatest17.mro.cpqcorp.net/infoboard_ws_1100/infoboard.asmx?wsdl
    Spring集成Ehcache[收拾]????????????</value>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????????<property?name="namespaceUri">
    Spring集成Ehcache[收拾]????????????<value>http://tempuri.org/InfoBoard_WS/Service1</value>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????????<property?name="serviceName">
    Spring集成Ehcache[收拾]????????????<value>Service1</value>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????????<property?name="portName">
    Spring集成Ehcache[收拾]????????????<value>Service1Soap</value>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????????<property?name="portInterface">
    Spring集成Ehcache[收拾]????????????<value>
    Spring集成Ehcache[收拾]????????????????org.tempuri.InfoBoard_WS.Service1.Service1Soap
    Spring集成Ehcache[收拾]????????????</value>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????</bean>对infoboardservice进行增强:Spring集成Ehcache[收拾]????<bean?id="infoboardServiceCacheProxy"
    Spring集成Ehcache[收拾]????????class="org.springframework.aop.framework.ProxyFactoryBean">
    Spring集成Ehcache[收拾]????????<property?name="proxyInterfaces">
    Spring集成Ehcache[收拾]????????????<value>com.ph.serviceportal.infoboard.service.IInfoBoardService</value>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????????<property?name="target">
    Spring集成Ehcache[收拾]????????????<ref?local="infoboardService"?/>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????????<property?name="interceptorNames">
    Spring集成Ehcache[收拾]????????????<list>
    Spring集成Ehcache[收拾]????????????????<value>methodCachePointCut</value>
    Spring集成Ehcache[收拾]????????????????<value>methodCacheAfterAdvice</value>
    Spring集成Ehcache[收拾]????????????</list>
    Spring集成Ehcache[收拾]????????</property>
    Spring集成Ehcache[收拾]????</bean>

    <完>

    ?

热点排行