spring aop 之三利用aop實現bean注入的熱插拔
利用spring可以實現bean注入的熱插拔。
先看xml的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans
<bean id="helloServiceTarget" class="cn.com.ultrapower.service.HelloServiceImpl"/>
<bean id="welcomeServiceTarget" class="cn.com.ultrapower.service.WelcomeServiceImpl"/>
<bean id="swapper" class="org.springframework.aop.target.HotSwappableTargetSource">
<constructor-arg ref="helloServiceTarget"/>
</bean>
<bean id="helloService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource" ref="swapper"/>
</bean>
</beans>
上面代碼中HelloServiceImpl會打印hello,WelcomeServiceImpl會打印welcome。
helloService默認會注入的是helloServiceTarget,利用swapper bean 在程序運行時將注入引用的修改為welcomeServiceTarget。
測試用例如下:
public void testSwapper() {
/*
* 實現了動態將helloservice實現切換到welcomeservice實現
*/
String[] paths = {"applicationContext-hotswapper.xml"};
ApplicationContext context = new ClassPathXmlApplicationContext(paths);
HotSwappableTargetSource swapper = (HotSwappableTargetSource) context.getBean("swapper");
IHelloService service = (IHelloService) context.getBean("helloService");
// 第一次輸出
service.sayHello();
//獲取Welcome實現
WelcomeServiceImpl welcomeTarget = (WelcomeServiceImpl) context.getBean("welcomeServiceTarget");
//切換為welcome實現
swapper.swap(welcomeTarget);
// 第二次輸出
service.sayHello();
}
上面代碼會輸出:
hello
welcome
驗證了程序在運行中將service的實現由helloserviceImpl切換到welcomeserviceimpl