2016-02-25 115 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;