读书人

Spring集成Ehcache[收拾]

发布时间: 2012-07-19 16:02:20 作者: rapoo

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 代码说明了:
读书人网 >软件架构设计

热点推荐