2016-02-25 210 views
2

我在Spring XML文件跨越一個奇怪的語法運行:Spring屬性配置語法?

<bean id="mySessionFactory" class="my.thingy.session.SessionFactoryImpl"> 
    <property name="myPropertyName"> 
     <!-- WHAT IS THIS VALUE? --> 
     <value>${process.file.thing:propname.server}</value> 
    </property> 
</bean> 

我不熟悉的${value1:value2}佔位符的語法 - 什麼是在那裏做的第一個值value1?它是一個類路徑,包名稱,文件夾名稱還是什麼?我搜索了這方面的一些解釋,但它顯然是無證

回答

1

我不熟悉的$的語法(至少據我可以告訴。){值1:值2}佔位符

這是春季表達語言的PropertySourcesPlaceholderConfigurer備用價值機制。 value2用作value1的默認值。如果value1存在,它將被使用。否則,將使用value2,在這種情況下,value2只是一個字面意思。

${process.file.thing:propname.server} 

在這種情況下,春季首先嚐試解決一個名爲從環境process.file.thing財產。如果成功,它將使用該值。否則,將使用propname.server文字。

PropertyPlaceholderHelperparseStringValue方法負責解決默認值。此方法是這樣的:

String propVal = placeholderResolver.resolvePlaceholder(placeholder); 
if (propVal == null && this.valueSeparator != null) { 
    int separatorIndex = placeholder.indexOf(this.valueSeparator); 
    if (separatorIndex != -1) { 
     String actualPlaceholder = placeholder.substring(0, separatorIndex); 
     String defaultValue = placeholder.substring(separatorIndex + this.valueSeparator.length()); 
     propVal = placeholderResolver.resolvePlaceholder(actualPlaceholder); 
     if (propVal == null) { 
      propVal = defaultValue; 
     } 
    } 
} 

該特徵已經描述herePlaceholderConfigurerSupport的Javadoc中:

默認屬性值可以全局通過屬性屬性被定義爲每個配置器 實例,或上每個屬性使用默認值分隔符 ,默認爲「:」, 可通過setValueSeparator(String)進行定製。

+1

感謝。我仍然無法在春季文檔中找到任何跡象,這是令人討厭的。你會認爲像這樣的功能將被記錄。好吧。 – user1071914

+0

也許更新可以幫助... –

1

value1是屬性名稱,value2是一個默認值,如果沒有找到屬性。這對防止異常很有用(特別是當有人添加新的屬性而不告訴其餘的團隊!)。

實例:

@Value("${search.engine.url:https://www.google.com}") 
private String searchEngine;