天天看點

動态設定Spring中bean的屬性

這兩天在整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());

    }

}