importjava.io.Serializable;
importnet.sf.ehcache.Cache;
importnet.sf.ehcache.Element;
importorg.aopalliance.intercept.MethodInterceptor;
importorg.aopalliance.intercept.MethodInvocation;
importorg.springframework.beans.factory.InitializingBean;
/**
*拦截器,用于缓存方法返回结果.
*
*@version$Id:MethodCacheInterceptor.javav1.02004-11-2814:57:00ZnjqExp$
*@authorZnjq
*/
publicclassMethodCacheInterceptorimplementsMethodInterceptor,
InitializingBean {
privateCache cache;
/**
*setscachenametobeused
*/
publicvoidsetCache(Cache cache) {
this.cache = cache;
}
/*
* (non-Javadoc)
*
* @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
*/
publicObject invoke(MethodInvocation invocation)throwsThrowable {
String targetName = invocation.getThis().getClass().getName();
String methodName = invocation.getMethod().getName();
Object[] arguments = invocation.getArguments();
Object result;
String cacheKey = getCacheKey(targetName, methodName, arguments);
Element element = cache.get(cacheKey);
if(element ==null) {
//call target/sub-interceptor
result = invocation.proceed();
//cache method result
element =newElement(cacheKey, (Serializable) result);
cache.put(element);
}
returnelement.getValue();
}
/**
*createscachekey:targetName.methodName.argument0.argument1...
*/
privateString getCacheKey(String targetName, String methodName,
Object[] arguments) {
StringBuffer sb =newStringBuffer();
sb.append(targetName).append(".").append(methodName);
if((arguments !=null) && (arguments.length != 0)) {
for(inti = 0; i < arguments.length; i++) {
sb.append(".").append(arguments[i]);
}
}
returnsb.toString();
}
/*
* (non-Javadoc)
*
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
publicvoidafterPropertiesSet()throwsException {
//TODOAuto-generated method stub
}
}