Оригинальный адрес: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.name
,иspring.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
не буду.