我在Spring XML文件中遇到了一个奇怪的语法:
<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
在那里做什么?它是类路径,包名称,文件夹名称还是什么?我已经搜索了一些这方面的解释,但它显然没有记录(至少据我所知。)
答案 0 :(得分:2)
我不熟悉$ {value1:value2}占位符的语法
它是 Spring表达式语言的 PropertySourcesPlaceholderConfigurer
回退值机制。 value2
用作value1
的默认值。如果存在value1
,则会使用它。否则,value2
将被使用,在这种情况下,value2
只是一个文字。
${process.file.thing:propname.server}
在这种情况下,spring首先尝试从其环境中解析名为process.file.thing
的属性。如果成功,它将使用该值。否则,将使用propname.server
字面值。
PropertyPlaceholderHelper
&#39; parseStringValue
方法负责解析默认值。此方法如下所示:
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;
}
}
}
此问题已在PlaceholderConfigurerSupport
的javadoc中描述here:
可以为每个配置器全局定义默认属性值 实例通过属性属性,或逐个属性 使用默认值分隔符的基础是&#34;:&#34;默认情况下 可通过
setValueSeparator(String)
自定义。
答案 1 :(得分:1)
value1
是属性名称,如果找不到该属性,则value2
是默认值。它有助于防止异常(特别是当某人添加新属性而不告诉团队其他成员时!)。
使用示例:
@Value("${search.engine.url:https://www.google.com}")
private String searchEngine;