具有多个位置的Spring属性占位符配置器中的属性解析顺序是什么?

2022-09-03 18:01:49

假设我有一个配置:

    <bean id="batchJobProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>first.properties</value>
            <value>second.properties</value>
        </list>
    </property>
</bean>

first.properties 有属性 “my.url=first.url” second.properties 有属性 “my.url=second.url”

那么哪个值将被注入“myUrl”bean呢?属性分辨率是否有任何定义的顺序?


答案 1

The javadoc for PropertiesLoaderSupport.setLocation state

设置要加载的属性文件的位置。

可以指向经典属性文件或遵循 JDK 1.5 的属性 XML 格式的 XML 文件。

注: 在键重叠的情况下,在更高版本中定义的属性将覆盖早期文件中定义的属性。因此,请确保最具体的文件是给定位置列表中的最后一个文件。

因此,my.url 在 second.properties 中的值将覆盖 first.properties 中 my.url 的值。


答案 2

最后一个获胜。

假设我们有 props1.properties 作为

prop1=val1

和属性2.属性

prop1=val2

和上下文.xml

<context:annotation-config />
<bean id="batchJobProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>/props1.properties</value>
            <value>/props2.properties</value>
        </list>
    </property>
</bean>
<bean class="test.Test1" /> 

然后

public class Test1 {
    @Value("${prop1}")
    String prop1;

    public static void main(String[] args) throws Exception {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/test1.xml");
        System.out.println(ctx.getBean(Test1.class).prop1);
    }

}

指纹

val2

如果我们将上下文更改为

        <list>
            <value>/props2.properties</value>
            <value>/props1.properties</value>
        </list>

相同的测试打印件

val1