Из каких источников Spring Boot может загружать свойства (properties) конфигурации?

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

Ответ

Spring Boot загружает свойства из множества источников, соблюдая определённый порядок приоритета. Свойства из источников с более высоким приоритетом переопределяют свойства из источников с низким приоритетом.

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

  1. Дефолтные свойства (задаются SpringApplication.setDefaultProperties).
  2. @PropertySource на классах с @Configuration.
    @Configuration
    @PropertySource("classpath:custom.properties")
    public class MyConfig { }
  3. Файлы конфигурации (.properties или .yml):
    • application.properties внутри упакованного JAR (classpath:)
    • Файлы в директории ./config/ относительно текущей директории.
    • Файлы в текущей директории (./).
    • Профильные файлы (например, application-dev.properties) имеют приоритет над основным application.properties.
  4. Переменные окружения ОС (например, export DB_HOST=localhost).
  5. Java System Properties (-D аргументы JVM, например, -Dserver.port=8081).
  6. Аргументы командной строки (например, java -jar app.jar --server.port=8082).

Практическое использование и инъекция:

@Component
public class MyComponent {
    // Инъекция значения напрямую
    @Value("${app.page.size:10}") // Значение по умолчанию '10'
    private int pageSize;

    // Более структурированный подход через @ConfigurationProperties
    @ConfigurationProperties(prefix = "app.datasource")
    public class DataSourceProps {
        private String url;
        private String username;
        // getters/setters
    }
}

Ключевой вывод: Самый высокий приоритет у аргументов командной строки, затем системные свойства и переменные окружения. Это позволяет легко переопределять конфигурацию для разных сред (dev, prod) без изменения файлов приложения.