Как использовать @ConfigurationProperties для работы с конфигурацией в Spring Boot?

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

Ответ

@ConfigurationProperties — это механизм в Spring Boot для типобезопасной привязки свойств из внешних источников (.properties, .yml, переменные окружения) к Java-объектам.

Базовый пример:

  1. Создание класса-держателя свойств:
    @Component
    @ConfigurationProperties(prefix = "app.mail") // Связывает свойства с префиксом app.mail
    @Validated // Включает валидацию JSR-303
    public class MailProperties {
        @NotNull
        private String host;
        private int port = 587; // Значение по умолчанию
        private boolean authEnabled;
        private List<String> recipients = new ArrayList<>();
        // Обязательны геттеры и сеттеры
        public String getHost() { return host; }
        public void setHost(String host) { this.host = host; }
        // ... остальные геттеры/сеттеры
    }
  2. Определение свойств в application.yml:
    app:
      mail:
        host: smtp.example.com
        port: 465
        auth-enabled: true
        recipients:
          - admin@example.com
          - alert@example.com
  3. Использование в сервисе:

    @Service
    public class NotificationService {
        private final MailProperties mailProps;
    
        public NotificationService(MailProperties mailProps) {
            this.mailProps = mailProps;
            System.out.println("Mail host: " + mailProps.getHost());
        }
    }

Способы активации (альтернативы @Component):

  • Через @EnableConfigurationProperties в классе конфигурации:
    @Configuration
    @EnableConfigurationProperties(MailProperties.class)
    public class AppConfig { }
  • Явная регистрация бина с @Bean.

Ключевые особенности:

  • Релоад конфигурации: В сочетании с @RefreshScope (Spring Cloud) позволяет обновлять свойства без перезапуска приложения.
  • Вложенные свойства: Поддерживает сложные объекты и Map.
  • Конвертация типов: Автоматически конвертирует строки в типы (Duration, DataSize, пользовательские конвертеры).
  • Метаданные: Генерация spring-configuration-metadata.json для IDE-подсказок.

Преимущество над @Value: Централизация, валидация, реюзабельность и работа со сложными структурами данных.