Внешняя конфигурация
Тема дорожной карты · Spring Boot
Вынесенная конфигурация в Spring Boot — это практика хранения всех специфичных для среды настроек — URL баз данных, флагов функций, API-ключей, портов сервера — вне бинарного файла приложения, чтобы одни и те же JAR или Docker-образ работали без изменений в средах разработки, тестирования и продакшена. Система вынесенной конфигурации Spring Boot определяет 17-уровневый порядок приоритета PropertySource: аргументы командной строки переопределяют переменные окружения ОС, которые переопределяют application.properties внутри JAR, которые переопределяют умолчания, заданные в коде через @Value("${key:default}"). Профиль-специфичные файлы (application-production.yml, application-staging.yml) автоматически загружаются поверх базового application.properties, когда установлен spring.profiles.active или SPRING_PROFILES_ACTIVE, обеспечивая конфигурацию для каждой среды без изменения кода. В развёртываниях Spring Cloud вынесенная конфигурация расширяется Spring Cloud Config Server, который раздаёт свойства из Git-репозитория и поддерживает обновление @ConfigurationProperties-бинов во время работы через /actuator/refresh. Для Spring Boot-сервисов, работающих в Kubernetes, лучшие практики рекомендуют внедрять секреты как переменные окружения из объектов Kubernetes Secret, а несекретную конфигурацию — из записей ConfigMap, сохраняя все учётные данные вне образов контейнеров.
Как это работает
Внешняя конфигурация: Spring грузит application.properties или application.yml из src/main/resources + classpath. Profiles (@Profile("prod"), application-prod.yml) активируют environment-specific config. @ConfigurationProperties связывает property-prefixes с типизированными POJO (с валидацией). Environment variables перебивают файлы. Внешняя конфигурация (volume-mounted файл, Spring Cloud Config server, Kubernetes ConfigMap/Secrets) перебивает bundled-defaults. Precedence строгая — знайте порядок.
Когда применять
YAML для human-readable иерархического config; properties для плоских key=value. Всегда @ConfigurationProperties вместо разбросанных @Value — даёт валидацию, IDE-поддержку, refactor safety. Инжектьте секреты через env vars или secrets manager — не коммитьте. Profiles для environment-различий; один profile на env (dev, stage, prod).
Типичные ошибки
Ловушки Внешняя конфигурация: коммит application-prod.yml с реальными секретами (Vault, Spring Cloud Config или env vars); не валидируют config (@Validated на @ConfigurationProperties ловит плохой config на startup, не в prod); много profiles активны с конфликтами; смешение @Value + @ConfigurationProperties для того же ключа.