這兩天在整Spring的JMS
我們需要動态的設定message receiver的selector選擇性的接受消息
Spring的做法是要在DefaultMessageListenerContainer裡設定selector的屬性,可是要寫在配置檔案裡,這樣就不能動态設定了
仔細研究了下Spring的文檔,發現了解決辦法:
可以使用一個類的靜态或非靜态的方法來指定另外一個bean的屬性
要用到 org.springframework.beans.factory.config.MethodInvokingFactoryBean 這個助手類
在配置檔案裡配置它的targetClass--指定一個類,targetMethod-指定要調用的靜态方法,這個方法傳回的結果作為一個bean指派給目标bean的具體屬性
舉一個簡單的例子:
我們要動态的設定ExampleBean裡的name屬性,ExampleBeanHelper是其助手類,有一個靜态方法getName();
public class ExampleBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ExampleBeanHelper {
private static String name = null;
public static String getName() {
return name;
}
public static void setName(String name) {
ExampleBeanHelper.name = name;
}
}
<beans>
<bean id="exampleBean"
class="com.dsrcom.ecq.service.mhc.ExampleBean">
<property name="name">
<ref local="beanNameHelper" />
</property>
</bean>
<bean id="beanNameHelper"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass">
<value>com.dsrcom.ecq.service.mhc.ExampleBeanHelper</value>
</property>
<property name="targetMethod">
<value>getName</value>
</property>
</bean>
</beans>
單元測試:
public class TestDynamicBeanPropertySet extends TestCase {
private ClassPathXmlApplicationContext context = null;
public void setUp() {
ExampleBeanHelper.setName("bean");
context = new ClassPathXmlApplicationContext(
new String[] { "classpath:com/dsrcom/ecq/service/mhc/bean.xml" });
}
public void testBean() {
ExampleBean bean = (ExampleBean)context.getBean("exampleBean");
assertEquals("bean", bean.getName());
}
}