簡體   English   中英

如何在Spring applicationContext.xml中讀取JVM參數

[英]How do I read JVM arguments in the Spring applicationContext.xml

我有一個使用Spring的JSF Web應用程序,我試圖找到一種方法來引用applicationContext.xml中的JVM參數。 我使用環境參數啟動JVM(例如-Denv = development)。 我找到並嘗試了一些不同的方法,包括:

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

但是,當在MyClass中調用setter方法時,將傳遞字符串“$ {environment}”,而不是“development”。 我有一個使用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" />

你可以使用Spring EL表達式,然后它是#{systemProperties.test} -Dtest="hallo welt" #{systemProperties.test} for -Dtest="hallo welt"

在你的情況下,它應該是:

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

#而不是$是沒錯的!

$表示占位符,而#表示bean,而systemProperties是bean。


可能只是拼寫錯誤,但可能是您的問題的原因:在命令行語句的示例中,您將變量命名為env

-Denv=development ,例如...

但在spring配置中,您將其命名為environment 但兩者當然必須是平等的!

如果您注冊PropertyPlaceholderConfigurer,它將使用系統屬性作為后備。

例如,添加

<context:property-placeholder/>

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

您可以根據系統屬性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相應的測試來獲得應用程序的風格。

使用#{systemProperties['env']} 基本上將Java命令行中使用的propertyName作為-DpropertyName=value 在這種情況下,它是-Denv=development這么用env

有趣的是,Spring已經發展到使用PropertySources更優雅地處理這種需求: http//spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/

如果您正在使用Web應用程序,那么使用一些配置和可能的自定義ApplicationInitializer,您可以使用屬性占位符處理系統,環境和自定義屬性。 Spring提供了PropertySourcesPlaceholderConfigurer,它在Spring配置中使用。 那個會在你的屬性文件中尋找屬性,然后是System,然后是環境。

Spring 3.0.7

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

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

如果沒有設置“env”將使用默認的“config-prd.properties”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM