Annotation兑现缓存,使用AOP的HotSwappableTargetSource

Annotation实现缓存,使用AOP的HotSwappableTargetSource
HotSwappableTargetSource是一个可以动态替换的对象,这个类很有用,可以在运行期间动态替换目标对象。
如下配置:
	 <!-- 3. DynaProxy -->
	 <bean id="dynaProxy"
		class="org.frame.base.annotation.support.EhCacheFactoryBean" init-method="init"> 
		<property name="targetSource">
			<ref bean = "targetSource"/>
		</property> 
	</bean> 
	<!-- 默认配置 -->
	<bean id="targetSource" class="org.springframework.aop.target.HotSwappableTargetSource" autowire="constructor" >
	<constructor-arg>
		<ref bean="testI"/>
	</constructor-arg>
	</bean>

新建一个ehcache的动态代理替换类
package org.frame.base.annotation.support;

import org.springframework.aop.target.HotSwappableTargetSource;
import org.springframework.context.ApplicationContext;

/**
 * use new EhCacheDynaProxy<T>(ctx,factory,dynaint).getObject();
 * 
 * 
 * @param <T>
 */
public class EhCacheDynaProxy<T> {

	private String factory;
	private String dynaint;
	private ApplicationContext ctx;

	public EhCacheDynaProxy(ApplicationContext ctx, String factory,
			String dynaint) {
		this.ctx = ctx;
		this.factory = factory;
		this.dynaint = dynaint;
	}

	@SuppressWarnings("unchecked")
	public T getObject() throws Exception {
		EhCacheFactoryBean dyna = (EhCacheFactoryBean) ctx.getBean(factory);
		HotSwappableTargetSource targetSource = (HotSwappableTargetSource) ctx
				.getBean("targetSource");
		T intabc = (T) ctx.getBean(dynaint);
		targetSource.swap(intabc);
		dyna.setTargetSource(targetSource);
		dyna.init();
		intabc = (T) dyna.getObject();
		return intabc;
	}
}


测试代码如下:
/**
		 * 在当前Factory的都会cache.
		 */
		ApplicationContext cxt  = new ClassPathXmlApplicationContext(new String[]{"annotation/ano.xml","annotation/bean.xml"});
		//TestI testI = (TestI) cxt.getBean("testI");
		TestI testI = (TestI)new EhCacheDynaProxy<Intabc>(cxt,"&dynaProxy","testI").getObject(); 
		int a = 10;
		int b = 11;
		System.out.println(testI.add(a, b));
		System.out.println(testI.add(a, b));
		System.out.println(testI.xx(a));
		System.out.println(testI.xx(a)); 
		Intabc intabc = new EhCacheDynaProxy<Intabc>(cxt,"&dynaProxy","intabc").getObject(); 
		
		System.out.println(intabc.test(a, b));
		System.out.println(intabc.test(a, b));

可以看到EhCacheDynaProxy可以代理任何接口类,并动态的生成Ehcache代理对象,实现缓存.