Как Spring выбирает конфигурацию для активного профиля
Что проверяют
Понимаете ли вы, откуда берутся настройки и в каком порядке они перекрывают друг друга. Это ежедневная тема при выкатке на разные среды.
Как отвечать
Профиль это метка окружения. Активный профиль задаётся свойством spring.profiles.active, и его можно передать через переменную окружения, аргумент командной строки, файл настроек или системное свойство.
Что происходит при активном профиле:
- подхватывается файл
application-{профиль}.ymlили.propertiesв дополнение к базовомуapplication.yml, а не вместо него. Значения из профильного файла перекрывают базовые; - бины, помеченные
@Profile("dev"), попадают в контекст только при этом профиле, остальные пропускаются; - можно указать несколько профилей сразу, тогда они применяются по порядку, и последний имеет приоритет.
Обязательно проговорите порядок источников свойств, потому что именно там кроются сюрпризы. Приоритет по возрастанию: значения по умолчанию в коде, файлы в classpath, профильные файлы, внешние файлы рядом с приложением, переменные окружения, аргументы командной строки. Аргумент командной строки перебивает всё, поэтому в контейнере настройки чаще всего передают переменными окружения.
Полезно назвать практики: не хранить секреты в файлах репозитория, а брать их из переменных окружения или хранилища секретов; иметь профиль для тестов, где база подменяется контейнером; проверять на старте, какой профиль активен, потому что классическая авария это выкат с профилем разработки в бой.
Где спотыкаются
Думают, что профильный файл заменяет базовый целиком.
Не знают, что переменная окружения перебивает файл, и правят файл, не понимая, почему ничего не меняется.
Держат в профиле prod реальные пароли в репозитории.