Какие способы конфигурации Spring-приложения вы предпочитаете и в каких случаях?

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

Ответ

Выбор зависит от типа настройки. Оптимален комбинированный подход:

  1. @ConfigurationProperties для структурированных настроек (наилучшая практика).

    • Зачем: Типизированный доступ к группам свойств, валидация через @Validated.
      @Configuration
      @ConfigurationProperties(prefix = "app.api")
      @Validated
      public class ApiConfig {
      @NotBlank
      private String url;
      @Min(1000)
      private int timeoutMs;
      private List<String> supportedVersions;
      // Стандартные геттеры и сеттеры
      }
      # application.yml
      app:
      api:
      url: https://api.example.com
      timeout-ms: 5000
      supported-versions: [v1, v2]
  2. YAML-файлы (application.yml) для внешней конфигурации.

    • Зачем: Читаемость, поддержка иерархических структур, возможность переопределения через профили (application-prod.yml).
  3. Внешние источники для гибкости в production.

    • Переменные окружения: export DATABASE_URL=... (имеют наивысший приоритет).
    • Параметры командной строки: java -jar app.jar --server.port=8081.
    • Spring Cloud Config / Consul: Для централизованного управления конфигурацией в микросервисной архитектуре.
  4. @Value для простых, единичных свойств.

    @Value("${app.feature.enabled:false}") // :false - значение по умолчанию
    private boolean isFeatureEnabled;
  5. Программная конфигурация (@Bean) для сложных, условных или динамически создаваемых бинов.

Итог: Используйте @ConfigurationProperties с YAML для большинства настроек, переменные окружения для секретов и чувствительных данных, а программную конфигурацию — для сложной логики создания бинов.