Какой порядок приоритета при загрузке внешних конфигураций в Spring?

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

Ответ

В Spring Boot конфигурации загружаются в строгом порядке, где более высокий приоритет переопределяет более низкий. Порядок от высшего к низшему:

  1. Аргументы командной строки (--property=value)
  2. JNDI-атрибуты из java:comp/env
  3. Java System Properties (System.getProperties())
  4. Переменные окружения ОС
  5. Профильные файлы конфигурации (application-{profile}.properties/.yml)
  6. Основной файл конфигурации (application.properties/.yml)
  7. Аннотация @PropertySource
  8. Значения по умолчанию (через SpringApplication.setDefaultProperties)

Почему такой порядок? Он позволяет гибко управлять конфигурацией: переопределять настройки для конкретного окружения (например, через переменные окружения на продакшене) или для конкретного запуска (через аргументы командной строки).

Пример с профилями:

// application.properties (низкий приоритет)
app.name=DefaultApp
server.port=8080

// application-dev.properties (загружается при активном профиле 'dev')
app.name=DevApp
@Value("${app.name}")
private String appName; // Будет "DevApp", если активен профиль 'dev'

Важно: Внутри одного уровня приоритета (например, файлы) формат .yml имеет приоритет над .properties.