Одно и то же свойство задано в application.yml, в переменной окружения и аргументом командной строки. Какое значение победит?
- Какой источник настроек Spring Boot сильнее?
Победит аргумент командной строки. Порядок (сильнее → слабее): командная строка → системные свойства JVM → переменные окружения → профильные файлы → application.yml → значения по умолчанию.
- Файлы снаружи jar сильнее файлов внутри
- Профильный файл сильнее общего
- Итог и источник каждого значения — /actuator/env
А ещё Поэтому в контейнере настраивают переменными окружения
Подробно
Spring Boot собирает свойства из упорядоченного набора источников, и более внешний источник перекрывает более внутренний — логика в том, чтобы конфигурацию можно было переопределить при развёртывании, не пересобирая артефакт. Внутри файлов действует своя иерархия: файлы вне jar важнее упакованных, а профильные важнее общих. Полезно знать про relaxed binding: переменная окружения SPRING_DATASOURCE_URL соответствует свойству spring.datasource.url, потому что подчёркивания и регистр приводятся к общему виду. Проверить фактический источник значения можно эндпоинтом Actuator /actuator/env, что здорово экономит время при разборе неожиданной конфигурации.
Что хотят услышать
- Ответ и порядок источников.
- Практический вывод для контейнеров.
Частые ошибки
- Держать секреты в application.yml вместо внешних источников.
- Забывать про профильные файлы при отладке «неправильного» значения.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Значение из application.yml как из основного файла конфигурации
- ✗Переменная окружения — она задаётся ближе всего к среде исполнения
- ✗Порядок не определён: побеждает то значение, что прочитано последним
- ✓Аргумент командной строки: он выше env, а env — выше файлов
Что спросят дальше
- Как переменная окружения отображается в имя свойства?
- Чем @ConfigurationProperties удобнее набора @Value?
Разбор темы
- Spring Boot: автоконфигурация и starters
@SpringBootApplication и starters, механизм автоконфигурации по условиям, переопределение через @ConditionalOnMissingBean, внешняя конфигурация и её приоритеты.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.