欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

动态设定Spring中bean的属性

程序员文章站 2022-07-15 07:52:16
...

这两天在整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());
    }
}