Что такое запрос разрешения свойств в конфигурации Springholder placeholder с несколькими местоположениями?

Допустим, у меня есть конфигурация:

    <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"

Итак, какое значение будет введено в bean-компонент myUrl? Есть ли определенный порядок разрешения свойств?

Ответ 1

Состояние javadoc для свойствLoaderSupport.setLocation

Задайте местоположение файлов свойств, которые необходимо загрузить.

Может указывать на классические файлы свойств или файлы XML, которые следуют за XML-форматом JDK 1.5.

Примечание. Свойства, определенные в более поздних файлах, переопределяют свойства, определенные ранее файлами, в случае перекрытия ключей. Следовательно, убедитесь, что наиболее конкретные файлы являются последними в данном списке местоположений.

Таким образом, значение my.url в second.properties переопределит значение my.url в first.properties.

Ответ 2

Последний выигрывает.

Предполагая, что у нас есть props1.properties как

prop1=val1

и props2.properties

prop1=val2

и context.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