2012-09-07 51 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>