2

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

就是这样的配置:

<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 属性,例如 with-Duse=beanThree为别名选择另一个 bean。

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

有什么建议么?

4

2 回答 2

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>
于 2012-09-07T10:57:20.637 回答
1

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

我可以通过在我的 Java 项目的属性文件中设置属性“data.strategy”来在 bean 之间进行选择。

<bean id="myBeanId" class="com.some.path.MyBeanClass" >
    <property name="dataStrategy" value="#   {'${data.strategy}'.equalsIgnoreCase('TEST_DATA') ? testDataStrategy : realDataStrategy}" />
</bean>
于 2014-07-02T07:51:16.860 回答