`
liushilang
  • 浏览: 88836 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

动态设定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());
    }
}

分享到:
评论

相关推荐

    spring bean life cycle

    2. **属性注入**:实例化后,Spring会根据Bean定义中的`property`或`ref`属性为Bean注入依赖。这包括了通过setter方法设置值,以及通过构造函数传递参数。 3. **初始化**:在属性注入完成后,Spring会执行Bean实现...

    spring中bean的范围(xml/annotation)

    这篇博客主要探讨了如何通过XML配置和注解的方式来设定Spring Bean的范围。 首先,让我们理解Bean的几种基本范围: 1. **Singleton**:这是Spring的默认范围,每个Spring容器只有一个Bean实例。当容器启动时,会...

    Spring动态定时器

    在Spring配置中,`cronExpression`属性用于定义任务的执行周期。要实现实时动态调整任务执行周期,关键在于能够动态地修改`cronExpression`的值。这通常涉及到直接操作Spring容器中的`CronTriggerBean`实例,通过...

    《spring in action》中文第三版

    在Spring框架中,“Bean”是指由Spring IoC容器所管理的对象。这些对象由Spring IoC容器创建、装配以及管理其生命周期。Bean通常是由XML或Java配置类定义的,并且可以通过不同的方式(如构造器注入、setter注入等)...

    spring试题(含答案)

    8. 在 Spring 中配置 Bean 的 id 属性时,id 属性值不可以重复,id 属性不是必须的,但建议每个 Bean 都有一个唯一的 id。 9. Spring 和 Hibernate 整合过程中各对象注入可以通过 setter 注入、构造方法注入和接口...

    Spring学习笔记,精华摘要

    在XML配置中,可以使用`&lt;property&gt;`标签指定需要注入的属性,通过`&lt;ref&gt;`标签引用其他bean,Spring容器会在适当的时候调用setter方法完成注入。 构造注入则是通过构造函数来设定依赖关系。在配置文件中,使用`...

    Spring中配置定时器详解.doc

    在Spring中配置定时器,首先需要在`applicationContext.xml`配置文件中定义定时任务相关的Bean。具体步骤如下: 1. **定义`ScheduledTimerTask` Bean**:该Bean用于封装定时任务的执行逻辑,其`delay`属性表示首次...

    如何完成spring的最小化XML配置

    - `byName`:Spring会尝试查找与Bean属性名称相匹配的Bean进行注入。 - `byType`:根据Bean的类型,Spring会寻找相同类型的Bean进行注入。 - `constructor`:基于构造函数参数的类型进行自动装配。 - `auto...

    spring Quartz的jar包

    在Spring Quartz中,我们需要Spring来管理Quartz的bean并整合到Spring应用上下文中。 2. `quartz-all-1.6.0.jar`:这是Quartz的全功能版本,包含所有必要的模块,包括Job执行器、触发器、调度器以及相关的依赖。...

    spring多数据源

    6. **在代码中切换数据源**:在业务代码中,可以通过ThreadLocal或其他方式设置当前数据源的标识,使得在执行SQL操作时,Spring能够根据设定自动选择正确的数据源。 7. **读写分离**:多数据源的一个常见应用场景是...

    Spring从入门到精通

    - **什么是Bean:** Bean是Spring容器中的基本单元,代表应用程序中的对象。 - **Bean的基础知识:** - **Bean的标识(id和name):** 用来唯一标识Bean。 - **Bean的类(class):** 指定Bean对应的类。 - **...

    Spring常用注解(收藏大全).docx

    在 Spring 中,可以使用 `@Value` 注解将值注入到属性中。`@Value` 支持多种方式的注入,例如普通字符、操作系统属性、表达式结果、其它 bean 属性、文件资源和网站资源。 * `@Value`:为属性注入值。 环境切换 ...

    第十章 Spring 配置元信息(Configuration Metadata)1

    2. **Spring Bean属性元信息**:PropertyValues对象用于存储Bean的属性值,可以是可变的MutablePropertyValues。每个属性由PropertyValue对象表示,包含了属性名和对应的值。此外,AttributeAccessor用于提供Bean...

    spring学习笔记.doc

    bean的实例化策略可以通过scope属性来设定,"singleton"表示单例,"prototype"表示每次请求都会创建新的实例。 初始化和销毁方法: 可以使用`init-method`和`destroyed-method`属性指定bean的初始化和销毁方法,...

    spring使用心得 java ssh

    "spring中,如果想用自定义主键,则不要设置sequnce.txt"提示我们,在Spring配置Hibernate时,如果希望使用自定义的主键生成策略(例如,使用UUID或者自增字段),则不应设定sequence,因为sequence是Oracle数据库...

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring通过`org.springframework.scheduling.quartz`包中的API,将这些概念与Spring容器集成,使得我们可以利用Spring的bean管理来创建和管理Job。 集成Quartz到Spring的过程中,主要涉及以下步骤: 1. 添加依赖:...

    Spring 高级编程

    属性注入是Bean配置的重要部分,Spring允许通过构造器注入、setter方法注入等方式,来设定Bean的属性值,这极大地提高了代码的灵活性和可测试性。 ### AOP:面向切面编程 面向切面编程是Spring提供的一项强大功能,...

    spring配置文件----注解配置

    在早期的Spring版本中,所有的bean定义、依赖注入以及其他配置都存储在如`bsappConfig.xml`, `spring-config.xml`, `webapp-config.xml`等这样的XML文件中。这些文件通常位于项目的`src/main/resources`目录下,以便...

    springAop与spring定时器

    Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,通过在程序运行时动态地将代码插入到方法调用中,来实现跨切面的关注点,如日志记录、性能监控、事务管理等。而Spring...

Global site tag (gtag.js) - Google Analytics