Как Spring Boot работает с внешней конфигурацией?
- Откуда Spring Boot берёт настройки?
- Как передать настройки через переменные окружения?
Spring Boot собирает свойства из многих источников — application.yml, профильных файлов, переменных окружения, аргументов командной строки — в единое Environment. Читают их через @Value (точечно) или @ConfigurationProperties (группой в объект).
- Порядок: аргументы командной строки > переменные окружения > внешние файлы > файлы в jar
- Relaxed binding:
SPRING_DATASOURCE_URL=spring.datasource.url - Секреты — из переменных окружения или менеджера секретов, не из репозитория
А ещё spring.config.import подключает другие источники: configtree, Vault, Config Server
Подробно
Источники (упрощённо, от сильного к слабому): аргументы --server.port=9000, системные свойства JVM, переменные окружения, application-{profile}.yml и application.yml снаружи jar (рядом или в config/), те же файлы внутри jar. Значение из более сильного источника переопределяет слабое — поэтому в контейнере настройки задают переменными окружения, не пересобирая образ.
Relaxed binding: spring.datasource.url можно задать как SPRING_DATASOURCE_URL (переменная окружения), spring.datasource.url в yml, --spring.datasource.url в аргументах.
Чтение:
@Value("${payments.timeout:5s}")— одно значение с умолчанием;@ConfigurationProperties(prefix = "payments")— группа настроек в типизированный объект с валидацией.
Секреты: пароли и ключи не хранят в application.yml в репозитории. Варианты: переменные окружения, spring.config.import=configtree:/run/secrets/ (файлы из Kubernetes secrets), Spring Cloud Vault, Config Server.
Отладка: /actuator/env и /actuator/configprops показывают итоговые значения и источник каждого (секреты маскируются).
Что хотят услышать
- Набор источников и приоритет.
- Relaxed binding и переменные окружения.
- @Value и @ConfigurationProperties.
- Где хранить секреты.
Частые ошибки
- Пересобирать образ ради смены настройки.
- Хранить пароли в application.yml в git.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Свойства из файлов, env и аргументов с приоритетами; читаются через @ConfigurationProperties
- ✗Только из application.properties: переменные окружения и аргументы командной строки игнорируются
- ✗Конфигурация зашита в код и меняется пересборкой
- ✗Только через системные свойства JVM, заданные флагами -D при запуске приложения
Что спросят дальше
- Каков порядок переопределения источников?
- Как валидировать конфигурацию?
Разбор темы
- ApplicationContext и конфигурация
BeanFactory против ApplicationContext, способы конфигурации, @Configuration full/lite, профили и Environment, @Conditional.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.