2011-04-08 45 views
20

我有一個JSF Web應用程序和Spring,我想弄清楚從applicationContext.xml引用JVM參數的方法。我使用環境參數(例如-Denv = development)啓動JVM。我已經找到並嘗試了幾種不同的方法,包括:如何閱讀Spring應用程序中的JVM參數applicationContext.xml

<bean id="myBean" class="com.foo.bar.myClass"> 
    <property name="environment"> 
    <value>${environment}</value> 
    </property> 
</bean> 

但是,當setter方法MyClass中被調用時,字符串「$ {}環境」傳遞的,而不是「發展」。我有一個適當的工作來使用System.getProperty(),但它會更好,更清潔,能夠通過Spring設置這些值。有沒有辦法做到這一點?

編輯: 我應該之前提到的是,我從我的數據庫使用JDBC連接加載性能。這似乎增加了複雜性,因爲當我將屬性佔位符添加到配置時,從數據庫加載的屬性被屬性佔位符覆蓋。我不確定它是否依賴訂單或其他。這就像我可以做一個或另一個,但不是兩個。

編輯: 我使用以下配置當前所加載的特性:

<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="jdbc.mydb.myschema"/> 
</bean> 

<bean id="props" class="com.foo.bar.JdbcPropertiesFactoryBean"> 
    <property name="jdbcTemplate"> 
     <bean class="org.springframework.jdbc.core.JdbcTemplate"> 
      <constructor-arg ref="myDataSource" /> 
     </bean> 
    </property> 
</bean> 

<context:property-placeholder properties-ref="props" /> 

回答

26

您可以使用Spring EL表達式,那麼它是#{systemProperties.test}-Dtest="hallo welt"

你的情況應該是:而不是

<bean id="myBean" class="com.foo.bar.myClass"> 
    <property name="environment"> 
    <value>#{systemProperties.environment}</value> 
    </property> 
</bean> 

#$是沒錯的!

$指的是佔位符,而#指豆,而systemProperties是豆。


可以將它僅僅是一個拼寫錯誤,但也可能是你的問題的原因:在你的命令行語句的例子,你命名變量env

-Denv=development,例如。 ..

但在Spring配置你的名字environment。但兩者必須是當然的平等!

+0

我使用這種方法得到了相同的結果,因爲我在示例中使用了該方法。字符串「#{systemProperties.environment}」是傳遞給setter方法的東西。 – jinxed 2011-04-11 16:07:09

+0

@jinxed:我認爲我發現了最後一個問題,那裏是拼寫錯誤。 - 看到我的擴展答案。 – Ralph 2011-04-12 06:53:45

10

如果您註冊一個PropertyPlaceholderConfigurer,它將使用系統屬性作爲後備。

例如,添加

<context:property-placeholder/> 

到您的配置。然後,您可以在XML配置或@Value註釋中使用${environment}

+0

當我將其添加到配置中時,我從數據庫加載的屬性被此屬性佔位符覆蓋。編輯原始描述。 – jinxed 2011-04-11 17:27:40

+0

數據庫屬性是如何加載的?它們是PropertyPlaceholderConfigurer配置的一部分嗎? – sourcedelica 2011-04-11 17:45:07

+0

它們通過JDBC使用問題(上面)中顯示的配置加載... – jinxed 2011-04-11 20:27:51

3

可以加載基於系統屬性env這樣的屬性文件:

<bean id="applicationProperties" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="ignoreResourceNotFound" value="false" /> 
     <property name="ignoreUnresolvablePlaceholders" value="true" /> 
     <property name="searchSystemEnvironment" value="false" /> 
     <property name="locations"> 
     <list> 
      <value>classpath:myapp-${env:prod}.properties</value> 
     </list> 
     </property> 
    </bean> 

如果env沒有設置默認爲生產,否則開發和測試團隊可以通過設置-Denv=development-Denv=testing有自己的應用程序的味道因此。

+0

再次閱讀主題。這些屬性正在從數據庫中加載。問題是,如何在配置的其他地方使用JVM參數? – jinxed 2011-04-11 22:05:31

+0

這就是我在你的問題中看到的:'我用一個環境參數(例如-Denv = development)啓動JVM'我也在你提到的編輯問題中提到你正在從DB讀取一些屬性。是否有限制,只能從1個源讀取屬性? – anubhava 2011-04-11 22:15:48

+0

所有屬性都從數據庫加載。我理解使用PropertyPlaceholderConfigurer來引入JVM參數的概念,但是當我使用PropertyPlaceholderConfigurer時,已經成功加載的數據庫屬性現在缺失。 – jinxed 2011-04-11 22:24:29

0

有趣的是,春天更優雅演變爲處理這一需要,PropertySources: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/

少數配置,也許定製ApplicationInitializer如果你是一個Web應用程序,則可以有屬性佔位符手柄系統,環境和自定義屬性。 Spring提供了PropertySourcesPlaceholderConfigurer,當你在你的Spring配置文件中使用它。那個人會在你的屬性文件中尋找屬性,然後是系統,最後是環境。

0

春3.0.7

<context:property-placeholder location="classpath:${env:config-prd.properties}" /> 

而且在運行時設置: -Denv = config-dev.properties

如果沒有設置 「ENV」 將使用默認的 「config-prd.properties」。

1

使用#{systemProperties['env']} 基本上通過在Java命令行用作-DpropertyName=valuepropertyName。在這種情況下,它是如此使用env的-Denv=development

相關問題