Порядок приоритета конфигурации в Spring Boot: мелкий нюанс, который сломает вам вечер

Знание приоритета настроек Spring Boot спасёт от часов дебага и нервных срывов.
Если вы когда-нибудь меняли свойство в application.yml, запускали приложение, а оно упрямо игнорировало вашу волю — вы не одиноки. В Spring Boot есть чёткая иерархия источников конфигурации, и незнание её — прямой билет в ад дебага.
Как это работает (и ломает планы)
Spring Boot применяет настройки в строгом порядке: чем выше приоритет, тем больше шансов, что именно это значение попадёт в ваши бины. Иерархия выглядит так (от высшего к низшему):
- Аргументы командной строки (например,
--server.port=9090) - JNDI-атрибуты (кто их вообще использует, но они есть)
- Системные свойства JVM (через
-D) - Переменные окружения ОС (любимый способ DevOps-инженеров)
- Файл
application-{profile}.properties/yml(профильный) - Файл
application.properties/yml(основной) @PropertySourceна классах конфигурации (если вы такое пишете)- Значения по умолчанию (через
@Valueс дефолтом)
Самый частый сценарий боли: вы правите application.yml, но переменная окружения SERVER_PORT уже задана на сервере — и ваше приложение упорно слушает порт 8080, а не 9090. Или коллега передал аргумент командной строки в Docker-контейнере, и вы полдня ищете, откуда берётся странное значение.
Где подвох
Проблема в том, что разработчики часто забывают о более приоритетных источниках. Особенно коварны переменные окружения: они могут быть установлены системой, CI/CD или просто забыты в сессии терминала. Ещё одна грабля — профили: если вы запускаете приложение с spring.profiles.active=prod, то application-prod.yml переопределит общие настройки, но всё равно уступит аргументам командной строки.
Как не сойти с ума
- Всегда проверяйте активные источники через Actuator:
/actuator/envпокажет все значения и их происхождение. - Используйте префиксы вроде
--spring.config.additional-locationдля явного указания файлов. - Не полагайтесь на магию: если видите неожиданное поведение — начните с проверки переменных окружения и аргументов запуска.
Комментарий студии METABYTE: Мы знаем, как бывает обидно, когда приложение игнорирует ваши настройки, словно подросток — советы родителей. Наши разработчики всегда проверяют иерархию конфигурации, чтобы вы не тратили ночи на поиск таинственного server.port. А если хотите автоматизировать управление конфигами — мы знаем, как это сделать без боли.