使用System属性更改spring bean别名

时间:2012-09-07 09:40:36

标签: java spring inversion-of-control

我试图弄清楚是否可以通过系统属性更改弹簧别名配置。

这就是配置:

<beans>
    <bean id="beanOne" ... />
    <bean id="beanTwo" ... />
    <bean id="beanThree" ... />
    <alias name="beanOne" alias="beanToUse" />

    <bean id="consumer" ...>
        <constructor-arg ref="beanToUse" />
    </bean>
</beans>

我希望能够使用JVM属性,例如使用-Duse=beanThree为别名选择另一个bean。

不幸的是,使用直接解决方案<alias name="#{systemProperties.use}" alias="beanToUse" />会引发NoSuchBeanDefinitionException例外:(

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您是否尝试使用spring 3.1配置文件?

<beans>
    <bean id="beanOne" ... />
    <bean id="beanTwo" ... />
    <bean id="beanThree" ... />
    <beans profile="A">
      <alias name="beanOne" alias="beanToUse" />
    </beans>

    <beans profile="B">
      <alias name="beanTwo" alias="beanToUse" />
    </beans>

    <bean id="consumer" ...>
        <constructor-arg ref="beanToUse" />
    </bean>
</beans>

并通过系统属性-Dspring.profiles.active=A进行选择。我没有在配置文件中尝试过别名,但您可以在每个配置文件中使用其他beanToUse定义:

<beans>
    <beans profile="A">
      <bean id="beanToUse" ... defined as beanOne ... />
    </beans>

    <beans profile="B">
      <bean id="beanToUse" ... defined as beanTwo .../>
    </beans>

    <bean id="consumer" ...>
        <constructor-arg ref="beanToUse" />
    </bean>
</beans>

答案 1 :(得分:1)

以下是使用SpEL执行此操作的另一种方法。 我有两个DataStrategy类型的实现,包含bean ids testDataStrategy和realDataStrategy

我可以通过设置属性&quot; data.strategy&#39;来选择bean。在我的Java项目的Property文件中。

<bean id="myBeanId" class="com.some.path.MyBeanClass" >
    <property name="dataStrategy" value="#   {'${data.strategy}'.equalsIgnoreCase('TEST_DATA') ? testDataStrategy : realDataStrategy}" />
</bean>