В Spring Boot, переопределяют ли переменные окружения значения из application.properties?

«В Spring Boot, переопределяют ли переменные окружения значения из application.properties?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, переопределяют. Spring Boot использует иерархию источников свойств (Property Sources), где переменные окружения имеют более высокий приоритет, чем значения в application.properties или application.yml.

Порядок приоритета (от высшего к низшему):

  1. Аргументы командной строки (например, --app.name=CLIValue).
  2. Переменные окружения (например, APP_NAME=EnvValue).
  3. Файлы свойств профиля (например, application-prod.properties).
  4. Основные файлы свойств (application.properties).

Почему это полезно? Это основа 12-факторного приложения, позволяющая менять конфигурацию (пароли, URLs) между средами (dev, prod) без изменения кода.

Пример:

application.properties:

database.url=jdbc:h2:mem:localdb

Установка переменной окружения в OS или контейнере:

export DATABASE_URL=jdbc:postgresql://prod-host:5432/proddb

В коде Spring Boot аннотация @Value или Environment получит значение из переменной окружения:

@Value("${database.url}")
private String dbUrl; // Будет равно "jdbc:postgresql://prod-host:5432/proddb"

Важное правило именования: Spring Boot автоматически преобразует имена переменных окружения: DATABASE_URLdatabase.url (верхний регистр и подчеркивания заменяются на нижний регистр и точки).