2012-02-03 49 views
10
<bean id="Mybean" class="Bean"> 
    <property name="config" ref="dev"/> 
</bean> 

<bean id="dev" class="Dev"> 
    <property name="x" ref="Dev1"> 
    <property name="y" ref="Dev2"> 
    <property name="z" ref="Dev3"> 
</bean> 

<bean id="stag" class="Dev"> 
    <property name="x" ref="Stag1"> 
    <property name="y" ref="Stag2"> 
    <property name="z" ref="Stag3"> 
</bean> 

在上述情況下,MyBean中的config屬性的config屬性因環境而異。在開發時,config的參考更改爲dev。並且在分期中,參考更改爲stag。問題出現在彈簧文件中。我們必須在檢入之前每次分析config的引用。如果檢入的值爲dev的config的引用,我們可能需要解釋很多問題。如何在Spring中動態設置bean引用?

是否有任何解決方案可以使其自動化?
注意:Spring版本是2.0.1

+0

有沒有這樣的東西作爲春季2.1。有2.0和2.5。你的意思是3.1嗎? – skaffman 2012-02-06 13:20:57

+0

你在使用Maven嗎? – 2012-02-06 16:10:06

回答

9

從春季使用PropertyPlaceholderConfigurer,並刪除未使用的bean:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
     <value>env.properties</value> 
    </property> 
</bean> 

<bean id="Mybean" class="Bean"> 
    <property name="config" ref="config"/> 
</bean> 

<bean id="config" class="Config"> 
    <property name="x" ref="${x}"> 
    <property name="y" ref="${y}"> 
    <property name="z" ref="${z}"> 
</bean> 

和env.properties文件包含以下屬性:

x=Dev1 
y=Dev2 
z=Dev3 

x=Stag1 
y=Stag2 
z=Stag3 
1

Spring提供了一種稱爲屬性佔位符的機制。這樣你就可以在數據庫/屬性文件中設置某些屬性,並且spring會在啓動時填充它們。

用於此目錄的類位於here

+0

該解決方案無法正常工作..它給出錯誤,名稱爲{dev}的bean未定義..任何幫助? – Shashi 2012-02-03 13:19:48

2

你可以做到這一點使用PropertyPlaceholderConfigurer或使用@Profile

請參見

+1

@ShashiBhushan:[PropertyPlaceholderConfigurer](http://static.springsource.org/spring/docs/1.0.0/api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html)自1.0以來一直在Spring中。 – beny23 2012-02-06 13:27:35

+0

它給出的錯誤是名稱爲{dev}的bean未定義。任何幫助..可能是PropertyPlaceholderConfigure用於提供動態「值」,而不是動態「ref」。 Shashi 2012-02-06 15:58:24

+1

您忘記了「$」:'ref =「$ {dev}」' – 2012-02-06 16:09:12

3

假設你的意思是春天3.1,而不是春2.1(其中不存在),那麼你可以使用新的「恩環境配置文件「功能在3.1中引入。這使您可以爲每個環境定義一組bean,然後在運行時選擇「活動」bean。

查看此SpringSource Blog Entry的例子。

4
  1. 設置了由specfiy佔位豆,讓Spring知道你想要的佔位符
  2. 設置爲「我的豆」的配置使用「$ {ENV}」

爲例如:

<beans> 
<bean id="configBean" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      <property name="location"><value>env.properties</value></property> 
</bean> 

<bean id="Mybean" class="Bean"> 
    <property name="config" ref="${env}"/> 
</bean> 

</beans> 

,你需要的env = dev鍵值添加到env.properties文件

2

PropertyPlaceholderConfigurer就是答案,但我會想象你會希望發生這種情況,而不需要爲每個環境更新你的屬性文件。因此

我的建議是如下

  1. 使用PropertyPlaceholderConfigurer,但不創建一個屬性文件
  2. 默認情況下,PropertyPlaceholderConfigurer首先嚐試找到一個屬性文件中的值,但是如果失敗了, 它會尋找一個在系統屬性

因此,所有你需要做的就是定義兩個bean,你正在做同樣的方式,即devstag ..這是一個很好的方法,因爲您清楚地顯示了不同的配置......如果您還添加了一些別名以清楚地顯示您要使用的設置,這將有所幫助。

接下來,傳遞一個系統屬性,定義您在...中的模式,並理想地將PropertyPlaceholderConfigurer設置爲使用系統屬性。

所以..你的配置會是這個樣子

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"  
    systemPropertiesMode="2"/> 

<bean id="Mybean" class="Bean"> 
    <property name="config" ref="${launch.mode}"/> 
</bean> 

<bean id="dev" name="dev_mode" class="Dev"> 
    <property name="x" ref="Dev1"> 
    <property name="y" ref="Dev2"> 
    <property name="z" ref="Dev3"> 
</bean> 

<bean id="stag" name="staging_mode" class="Dev"> 
    <property name="x" ref="Stag1"> 
    <property name="y" ref="Stag2"> 
    <property name="z" ref="Stag3"> 
</bean> 

您可以在屬性在啓動時按以下方式再傳給

-D<property-name>=<value> 

因此,在這種情況下,你會使用

-Dlaunch.mode=dev_mode 

-Dlaunch.mode=staging_mode 

而且您不需要觸摸任何配置文件。

剛上systemPropertiesMode一進一步指出,接受值如下:

  • 0 - 千萬不要在系統屬性
  • 1 - 使用系統屬性作爲備用(即,如果在屬性文件中未找到)
  • 2 - 系統屬性始終覆蓋(模式我的建議)

希望它能幫助:)

注:此建議僅適用於春季< 3.1,因爲從3.1開始,推薦的方法是使用@Profile

相關問題