<!-- Ehcache拦截,使用代理来实现 -->
<bean id="beanPostProcessor" class="org.frame.base.annotation.support.EhCacheBeanPostProcessor" >
<property name="beans">
<set>
<value>testI</value>
<value>intabc</value>
</set>
</property>
</bean>
package org.frame.base.annotation.support;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Set;
import org.frame.base.annotation.intercept.ProxyHandler;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* 使用Ehcache代理来实现缓存拦截
*
*/
public class EhCacheBeanPostProcessor implements BeanPostProcessor{
private Set<String> beans;
public void setBeans(Set<String> beans) {
this.beans = beans;
}
@Override
public Object postProcessAfterInitialization(Object target, String beanName)
throws BeansException {
return target;
}
/**
* will be process the beans define in properties
* if you don't want to define
* you can define the pach model *DAO
* you can define the pach model *Service
* you can define the pach model *Action
* but i sugguest you define
*/
@Override
public Object postProcessBeforeInitialization(Object target, String beanName)
throws BeansException {
if(beans.contains(beanName)){
Class<?>[] interfaceClass = target.getClass().getInterfaces();
InvocationHandler handler = new ProxyHandler(target);
Object proxyObj = Proxy.newProxyInstance(target.getClass().getClassLoader(),
interfaceClass, handler);
return proxyObj;
}else{
return target;
}
}
}
指定代理的类,这样去除缓存很简单,代码不需要更改,只需要从拦截的beans设置里面去掉该beanName,缓存就没了,添加只需要添加该bean定义。