Основы SpringBoot2.x: порядок загрузки и переопределение приоритета файлов конфигурации

Spring Boot

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

SpringBootКонфигурационный файл согласован, по умолчаниюapplication.properties, многие конфигурации по умолчанию могут быть изменены через этот файл.Конечно, мы также можем добавить пользовательские конфигурации в этот файл конфигурации.key=valueконфигурация в форме.

Рекомендуемое чтение

Запутались в советах по настройке?

Когда мы используем средства разработки для настройки, появится соответствующая подсказка, и все это благодаряspring-configuration-metadata.jsonФайл метаданных конфигурации, который записываетназвание,Типы,Атрибуцияи другую информацию, если тип конфигурации枚举также может быть достигнуто选择性配置.

SpringBootПредоставляет зависимость, основной задачей которой является автоматическое создание метаданных конфигурации.spring-boot-configuration-processor, при упаковке будет вMETA-INFКаталог создает файл с именемspring-configuration-metadata.jsonдокумент.

Метод конфигурации

Хотя по умолчаниюpropertiesОтформатируйте файл конфигурации, но этот метод приведет к избыточной части префикса конфигурации, чуть менее читаемой,SpringBootВнутренне также поддерживает использованиеyamlспособ файла конфигурации, просто нужно быть вsrc/main/resourcesСоздайте каталог с именемapplication.ymlФайла достаточно, и он также предоставляет функции при использовании конфигурации.

Может существовать в проекте одновременноapplication.properties,application.ymlДва файла, после тестирования, нашел,propertiesПриоритет будет выше, одноименная конфигурация будетymlКонфигурация внутри перезаписывается.

Укажите файл конфигурации

Если имя файла конфигурации вашего приложения неapplication, вы хотите настроить его с помощью--spring.config.nameАргументы командной строки задаются следующим образом:

java -jar project-sample.jar --spring.config.name=custome

**Примечание:** Нам нужно только указать имя файла конфигурации, вы можете использоватьpropertiesилиyamlформат файла, указанная выше конфигурация будет загруженаsrc/main/resources/custome.ymlилиsrc/main/resources/custome.properties.

пройти через--spring.config.nameПросто изменив имя файла конфигурации, что нам нужно сделать, если мы изменим расположение каталога, в котором находится файл конфигурации?

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

java -jar project-sample.jar --spring.config.location=classpath:/configs/custome.yml

Если файл конфигурации не соответствует вашим потребностям, то вы можете посмотреть следующим образом:

java -jar project-sample.jar --spring.config.location=classpath:/configs/custome.yml,classpath:/configs/default.properties

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

если вы пройдетеspring.config.locationУкажите не файл, а каталог, обязательно добавьте "/" в конце пути, а затем объединитеspring.config.nameСоздайте файл конфигурации комбинации, пример комбинации выглядит следующим образом:

# 加载/configs/application.properties 或 /configs/application.yml(默认文件名)
java -jar project-sample.jar --spring.config.location=classpath:/configs/

# 加载/configs/custome.properties 或 /configs/custome.yml
java -jar project-sample.jar --spring.config.location=classpath:/configs/ --spring.config.name=custome

Меры предосторожности:spring.config.nameЗначение по умолчанию для этого параметра конфигурации:application, поэтому, если просто указатьspring.config.locationА в виде каталога приведенный выше пример будет автоматическиspring.config.nameПосле добавления к пути к каталогу, если указанныйspring.config.locationэто не каталог, здесь он будет проигнорированspring.config.nameзначение .

порядок загрузки

SpringBootПри запуске приложения файлы конфигурации загружаются в следующем порядке:

  1. Файлы конфигурации в пути к классам
  2. Файлы конфигурации в подкаталоге config пути к классам
  3. Файл конфигурации в корневом каталоге текущего проекта
  4. Файл конфигурации в подкаталоге config текущего корневого каталога проекта.

Структура хранения файла конфигурации примера проекта выглядит следующим образом:

. project-sample
├── config
│   ├── application.yml (4)
│   └── src/main/resources
|   │   ├── application.yml (1)
|   │   └── config
|   |   │   ├── application.yml (2)
├── application.yml (3)

Порядок загрузки конфигурационных файлов при запуске: 1 > 2 > 3 > 4

src/main/resourcesПриведенный ниже файл конфигурации будет помещен в проект при его компиляции.target/classesВниз.

переопределение приоритета

SpringBootВ файле конфигурации есть функция,Конфигурации с более высоким приоритетом загружаются позже,相同名称Конфигурация优先级较高встреча覆盖Терять优先级较低Содержание.

Чтобы лучше объяснить это, мы создаем отдельный в соответствии с соответствующим порядком загрузки.application.ymlФайл конфигурации для проверки наличия проблем с покрытием в соответствии с различными приоритетами, как показано на следующем рисунке:

image

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

запустить тест

Перед тестированием мы позволяем стартовому классу реализоватьCommandLineRunnerинтерфейс следующим образом:

@SpringBootApplication
public class LoadOrderOfConfigFilesApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(LoadOrderOfConfigFilesApplication.class, args);
    }

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

    @Override
    public void run(String... args) throws Exception {
        System.out.println("配置名称:" + name);
    }
}

После запуска проекта черезrunметод печати${name}содержание конфигурации.

Тест 1: последовательное покрытие

Сохраните указанные выше четыре файла конфигурации в соответствии с порядком загрузки, запустите проект и выведите содержимое консоли:

配置名称:project/config

Ожидания соответствуют фактическому результату в корне проектаconfigкаталог最后加载, так что это优先级по сравнению с тремя другими最高из,Порядок переопределения: 4> 3> 2> 1.

Тест 2: кросс-последовательное покрытие

В последней контрольной точке мы добавили файл конфигурации для каждого порядка загрузки, поэтому, если у нас есть только дваproject/config,classes/configЯвляются ли файлы конфигурации двух каталогов приоритетными?

удалить два других, оставить толькоproject/config,classes/configФайлы конфигурации в двух местах, вывод консоли запуска проекта выглядит следующим образом:

配置名称:project/config

Также выведите наивысший приоритетproject/configсодержимое конфигурационного файла,Порядок переопределения: 4 > 1

Контрольные точки: одиночная последовательная загрузка

Обычно при разработке проектаapplication.ymlфайл конфигурации вsrc/main/resourcesкаталог, но в соответствии с приведенным выше порядком загрузки мы можем разместить файл конфигурации где угодно, и он будет загружен при запуске.

оставить толькоclasses/configФайл конфигурации расположения и выходные данные консоли запуска проекта выглядят следующим образом:

配置名称:classes/config

IDEAправильноSpringBootПоддержка действительно сильная,classes/configФайл конфигурации ниже также предоставляет关键字提醒Функции.

Суммировать

Только поняв порядок загрузки конфигурационных файлов, вы сможете легко выполнять охват конфигурации и полностью контролировать использование различного содержимого конфигурации в разных средах.classes/application.ymlсамый низкий приоритет,project/config/application.ymlнаивысший приоритет.

автор личноблогИспользуйте фреймворк с открытым исходным кодомApiBootПомочь вам стать архитектором сервисов интерфейса API