动态设定Spring中bean的属性

本文详细介绍了如何在Spring中动态设置MessageListenerContainer的selector,通过使用MethodInvokingFactoryBean类来指定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());
    }
}

### Spring 框架中 Bean 生命周期详解 #### 实例化(Instantiation) 当应用程序启动时,Spring 容器会读取配置元数据并创建相应的 `BeanDefinition` 对象。随后,在需要的时候,容器根据这些定义来实例化 bean。这标志着生命周期的第一步——实例化阶段[^1]。 ```java // 假设有一个简单的 Java 类作为 Bean public class MyService { public MyService() { } } ``` #### 属性设置(Property Population) 一旦对象被成功实例化之后,紧接着进入属性填充过程。在此期间,依赖关系和其他必要的属性会被注入到新创建的对象内。此操作依据于配置文件中的设定或是基于注解的方式完成。 ```xml <!-- XML 配置方式 --> <bean id="myService" class="com.example.MyService"> <property name="dependency" ref="anotherBean"/> </bean> ``` #### 初始化方法调用(Initialization) 属性完成后即进入到初始化环节。此时可以执行一些自定义逻辑比如资源加载等准备工作。开发者可以通过实现特定接口(`InitializingBean`) 或者声明 init-method 来指定初始化回调函数;另外还支持通过事件监听机制捕获这一时刻的通知消息。 ```java // 使用 @PostConstruct 注解标记初始化方法 @PostConstruct public void initialize(){ System.out.println("MyService is initialized."); } ``` #### 正常运行期(Usage) 经过前面几个步骤处理完毕后的 bean 已经完全准备好供业务层调用了。在这个状态下它可以正常参与各种事务活动直至应用结束或者显式地触发销毁行为之前一直保持活跃状态。 #### 销毁前清理工作(Destruction) 最后一步便是释放占用资源以及做其他善后事宜的过程。同样地,除了依靠内置接口 (`DisposableBean`) 和 destroy-method 参数外也允许利用上下文关闭事件来进行优雅退出的操作。 ```java // 使用 @PreDestroy 注解标记销毁方法 @PreDestroy public void cleanup(){ System.out.println("MyService is being destroyed."); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值