在配置时更改spring bean属性

时间:2010-05-18 16:32:51

标签: java spring properties

在一个spring servlet xml文件中,我正在使用org.springframework.scheduling.quartz.SchedulerFactoryBean定期触发一组触发器。

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref local="AwesomeTrigger" />
            <ref local="GreatTrigger" />
            <ref local="FantasticTrigger"/>
        </list>
    </property>
</bean>

问题是在不同的环境中,我不希望某些触发器触发。有没有办法在我的build.properties中为环境或spring自定义上下文属性文件中定义某种配置或变量,以帮助bean xml确定哪些触发器应该包含在列表中?这样,例如,AwesomeTrigger将在开发中调用,而不是qa。

2 个答案:

答案 0 :(得分:4)

创建一个工厂bean,它根据属性

返回触发器列表
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <bean class="com.yourcompany.FactoryBeanThatReturnsAListOfTriggers">
            <property name="triggerNames" value="${some.property}" />
        </bean>

    </property>
</bean>

<context:property-placeholder location="classpath:your.properties" />

<强>参考:

答案 1 :(得分:2)

我遇到了同样的问题。

我做了什么:

我覆盖Trigger bean以添加启用的属性。

在我覆盖SchedulerFactoryBean.setTriggers之后,我只设置了启用的触发器。

您只需要在xml文件中使用这些新bean,并在属性文件中使用这些新bean。

前:

public void setTriggers(Trigger[] triggers) {
        ArrayList<Trigger> triggersToSchedule = new ArrayList<Trigger>();

        for(Trigger trigger : triggers){
            if(trigger instanceof SimpleTriggerBeanEnabler){
                if(((SimpleTriggerBeanEnabler)(trigger)).isEnabled()){
                    triggersToSchedule.add(trigger);
                }
            }
            else{
                triggersToSchedule.add(trigger);
            }
        }


        super.setTriggers(triggersToSchedule.toArray(new Trigger[triggersToSchedule.size()]));
    }