Spring属性配置语法?

时间:2016-02-25 17:40:29

标签: java spring

我在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在那里做什么?它是类路径,包名称,文件夹名称还是什么?我已经搜索了一些这方面的解释,但它显然没有记录(至少据我所知。)

2 个答案:

答案 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;