2012-09-07 52 views
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属性用-Duse=beanThree为别名选择另一个bean。

不幸的是采用了直板正解<alias name="#{systemProperties.use}" alias="beanToUse" />抛出一个异常NoSuchBeanDefinitionException :(

有什么建议?

+0

您是否检查此线程? http://stackoverflow.com/questions/317687/inject-property-value-into-spring-bean – Chris

+0

是的,我做过,但使用属性来检索参数本身并不是问题在这里...当然使用该技术将使启用引入一个代理,然后用它代替别名 - 但正如我所说,这不是问题。 – pagid

回答

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> 
+0

Btw。不错,另外:' ...'按预期工作,最终导致我打算的行为。非常感谢 :) – pagid

0

下面是使用SpEL做到这一点的另一种方法。 我有两个DataStrategy类型的beanID 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>