Annotation兑现缓存,使用AOP的HotSwappableTargetSource
Annotation实现缓存,使用AOP的HotSwappableTargetSource
HotSwappableTargetSource是一个可以动态替换的对象,这个类很有用,可以在运行期间动态替换目标对象。
如下配置:
新建一个ehcache的动态代理替换类
测试代码如下:
可以看到EhCacheDynaProxy可以代理任何接口类,并动态的生成Ehcache代理对象,实现缓存.
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代理对象,实现缓存.