Поговорим о приоритете загрузки конфигурации в SpringBoot

Spring Boot программист

Оригинальный адрес:Woohoo.kmmapper.com/2020/01/03/…

Эта статья в основном направлена ​​наspring.profiles.active,spring.config.locationа такжеspring.config.additional-locationМеханизм действия и первоочередные вопросы сравниваются на практике.

Кейс-проект этой статьи загружен в репозиторий github: https://github.com/glmapper/springboot-series-guides/tree/master/guides-properties.

spring.profiles.active

В дополнение к файлам application.properties можно также определить конфигурации для конкретных профилей, назвав их: application-{profile}.properties. Если не указаны активные профили, Environment укажет набор профилей по умолчанию (по умолчанию [default]), другими словами, если файл конфигурации активных профилей не отображается, по умолчанию загружается файл конфигурации application-default .properties.

Свойства файла конфигурации для конкретного профиля загружаются из того же места, что и стандартный файл application.properties (обычно в пути к классам); свойства, указанные в файле конфигурации для конкретного профиля, всегда имеют приоритет над конфигурацией по умолчанию.

В случае проекта (guides-properties) ресурсы включают два конфигурационных файла, application.properties и application-dev.properties.

конфигурация файла application.properties

spring.application.name=appNameInner
testKey=key-default

конфигурация файла application-dev.properties

testKey=key-dev

Выведите значение конфигурации при запуске с помощью следующего кода:

@Value("${testKey}")
private String testKey;

@PostConstruct
private void init(){
    System.out.println("-------------------------------");
    System.out.println(testKey);
    System.out.println("-------------------------------");
}

Когда spring.profiles.active не указан

пройти черезjava -jar guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jarЗапустите проект, и вывод консоли будет следующим:

2020-01-04 00:08:47.279  INFO 11050 --- [           main] com.glmapper.bridge.boot.BootStrap       : No active profile set, falling back to default profiles: default
-------------------------------
key-default
-------------------------------

Вывод - если указанные профили не отображаются, используются стандартные.

При указании spring.profiles.active

пройти черезjava -jar -Dspring.profiles.active=dev guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jarЗапустите проект, и вывод консоли будет следующим:

2020-01-04 00:08:14.426  INFO 11040 --- [           main] com.glmapper.bridge.boot.BootStrap       : The following profiles are active: dev
-------------------------------
key-dev
-------------------------------

Вывод такой, что в тех случаях, когда отображаются указанные профили, значения конфигурации в application.properties по умолчанию переопределяются.

spring.config.location

Семантика spring.config.location изменилась в SpringBoot 2.x (эта конфигурация приведет к тому, что application.properties в пути к классам больше не будут действовать). Причины следующие:

private Set<String> getSearchLocations() {
    // spring.config.location 直接使用此份文件,不会再处理其他配置文件
    if (this.environment.containsProperty(CONFIG_LOCATION_PROPERTY)) {
        return getSearchLocations(CONFIG_LOCATION_PROPERTY);
    }
    Set<String> locations = getSearchLocations(CONFIG_ADDITIONAL_LOCATION_PROPERTY);
    locations.addAll(
            asResolvedSet(ConfigFileApplicationListener.this.searchLocations, DEFAULT_SEARCH_LOCATIONS));
    return locations;
}

в корневом каталоге проектаconfСоздайте новый в каталогеapplication-conf.propertiesКонфигурационный файл, содержание следующее:

testKey=key-spring.config.location

пройти черезjava -jar -Dspring.config.location=conf/application-conf.properties guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jarЗапустите проект и обнаружите, что запуск сообщает об ошибке, поскольку в application-conf.properties нет конфигурации.spring.application.namespring.application.nameОн находится в application.properties в каталоге ресурсов, поэтому он также косвенно указывает на то, что упомянутая выше конфигурация сделает недействительной конфигурацию в пути к классам. новыйspring.application.nameПосле этого перезапустите проект,

spring.application.name=guides-properties
testKey=key-spring.config.location

Результат выглядит следующим образом:

2020-01-04 00:19:12.225  INFO 11147 --- [           main] com.glmapper.bridge.boot.BootStrap       : No active profile set, falling back to default profiles: default
-------------------------------
key-spring.config.location
-------------------------------

Итак, используяspring.config.locationПри указании внешнего файла конфигурации этот файл конфигурации должен полностью соответствовать потребностям текущей среды выполнения проекта, поскольку он не будет объединен с файлом конфигурации в каталоге ресурсов.

spring.config.additional-location

в настоящее время используетspring.config.additional-locationКогда вы настраиваете местоположения таким образом, в дополнение к местоположениям по умолчанию вы также будете использоватьspring.config.additional-locationназначенный.

дополнительное расположение: подразумевается инкрементная конфигурация

в корневом каталоге проектаconfСоздайте новый в каталогеapplication-addition.propertiesКонфигурационный файл, содержание следующее:

testKey=key-addition

пройти черезjava -jar -Dspring.config.additional-location=conf/application-addition.properties guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jarЗапустите проект, и вывод будет следующим:

2020-01-04 00:28:30.048  INFO 11384 --- [           main] com.glmapper.bridge.boot.BootStrap       : No active profile set, falling back to default profiles: default
-------------------------------
key-addition
-------------------------------

Вывод такой: значения конфигурации в application.properties по умолчанию переопределены.

Связь загрузки конфигурации spring.config.additional-location и spring.profiles.active

spring.config.locationНет необходимости в большинстве, оно самостоятельное, и нельзя пользоваться другим. Так что здесь мы только анализируемspring.config.additional-locationиspring.profiles.activeНастройте отношения загрузки.

Укажите обе конфигурации одновременно

пройти черезjava -jar -Dspring.profiles.active=dev -Dspring.config.additional-location=conf/application-addition.properties guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jarЗапустите проект, и вывод будет следующим:

2020-01-04 00:32:59.044  INFO 11451 --- [           main] com.glmapper.bridge.boot.BootStrap       : The following profiles are active: dev
-------------------------------
key-dev
-------------------------------

Чтобы исключить порядок, связанный с параметром -D, выполните его снова, используя следующий метод:java -jar -Dspring.config.additional-location=conf/application-addition.properties -Dspring.profiles.active=dev guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar, выход такой же, как и раньше, поэтому можно сделать вывод, что,spring.profiles.activeсоотношение приоритетовspring.config.additional-locationпод кайфом.

`spring.config.additional-location` указывает дифференциальную инкрементную конфигурацию

существуетspring.config.additional-locationДобавить ключ к

testKey=key-addition
additionKey=testAddition

использоватьjava -jar -Dspring.config.additional-location=conf/application-addition.properties -Dspring.profiles.active=dev guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jarЗапустите проект, и вывод будет следующим:

2020-01-04 11:44:42.227  INFO 12821 --- [           main] com.glmapper.bridge.boot.BootStrap       : The following profiles are active: dev
-------------------------------
key-dev
testAddition
-------------------------------

Выводspring.config.additional-locationМожет использоваться для предоставления механизма профилей или инкрементной конфигурации помимо настроек по умолчанию.

резюме

При использовании внешних файлов конфигурации порядок выполнения следующий:

spring.config.location > spring.profiles.active > spring.config.additional-location> по умолчаниюapplication.proerties.

через которыеspring.profiles.activeиspring.config.additional-locationУказанный файл конфигурации будет таким же, как и по умолчаниюapplication.proertiesобъединить как окончательную конфигурацию,spring.config.locationне буду.