2012-12-02 44 views
4

我想在Spring的applicationContext.xml中訪問從JVM傳遞的一些屬性值。根據Spring的表達式語言特徵,我知道一個方法是通過#{systemProperties.myProperty}獲得-DmyProperty=xyz如何通過applicationContext.xml中的某些默認值從Spring中的JVM選項訪問屬性值?

但我有興趣爲每個通過JVM分配的屬性設置默認值,以防用戶未從服務器的JVM選項中設置值。如何在Spring的任何上下文xml文件中實現此目的?請幫忙。

+0

看到我的更新,也許它會感興趣 –

回答

3

可以使bean這需要一個地圖參數從上下文中使用默認值,並初始化系統屬性

<bean class="test.B1"> 
    <constructor-arg> 
     <map> 
      <entry key="p1" value="v1" /> 
      <entry key="p2" value="v2" /> 
           .... 
     </map> 
    </constructor-arg> 
</bean> 

。在上下文

public B1(Map<String, String> defaultProperties) { 
    for (Map.Entry<String, String> e : defaultProperties.entrySet()) { 
     if (System.getProperty(e.getKey()) == null) { 
      System.setProperty(e.getKey() 
        , e.getValue()); 
     } 
    } 
} 

B1定義應使用#{systemProperties.myProperty}使得性能首先被初始化任何bean之前

UPDATE

這是有關重寫系統屬性。但是,如果你只需要覆蓋春天佔位喜歡這裏

<bean class="test.B1"> 
    <property name="prop1" value="${xxx}" /> 
</bean> 

它足以設置屬性佔位符的地方覆蓋ATTR爲「true」

<context:property-placeholder location="classpath:/app.properties" local-override="true" /> 
+0

這可以是一個很好的解決辦法。 – Atharva

1

在Spring EL,您可以在默認情況下添加值。你的情況:

#{systemProperties.myProperty:MyDefaultValue} 
+0

試過,它不工作在這裏給表達式語言解析錯誤,我想是在Spring Properties Place Holder中的$ {xy}。 – Atharva

0

使用基於註解的配置,可以提供使用Elvis操作符春EL默認:

@Value("#{systemProperties['hostname'] ?: 'default-hostname'}") 
private String hostname; 

基於atrain的有用的答案。我還沒有評論,或者我會把語法更正:(