![](/img/trans.png)
[英]How do I convert an applicationContext.xml into a spring @Configuration class?
[英]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.