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

Ответ

@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: Централизация, валидация, реюзабельность и работа со сложными структурами данных.

Ответ 18+ 🔞

Слушай, а вот эта штука @ConfigurationProperties — это ж просто пиздец как удобно, когда тебе надо натянуть кучу настроек из конфигов на свою здоровенную Java-бибуху. Вместо того чтобы, блядь, тыкать @Value в каждую дырку, как последний распиздяй.

Смотри, как это просто, ёпта:

  1. Леплю класс, куда всё сложу:
    @Component
    @ConfigurationProperties(prefix = "app.mail") // Ловлю всё, что начинается на app.mail
    @Validated // Чтобы валидацию прикрутить, если что не так — пусть валится с ошибкой сразу
    public class MailProperties {
        @NotNull // Вот, например, без хоста — нихуя не стартанем
        private String host;
        private int port = 587; // А порт по дефолту пусть будет 587, если в конфиге не указали
        private boolean authEnabled;
        private List<String> recipients = new ArrayList<>(); // Список адресов — тоже ок
        // Геттеры и сеттеры — обязательно, иначе Spring нихуя не привяжет, будет орать
        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  # Заметь, в коде camelCase (authEnabled), а тут через чёрточку — Spring сам разберётся, хитрая жопа!
        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("А почта у нас на: " + mailProps.getHost()); // И всё, бля, работает!
        }
    }

Активировать эту магию можно по-разному, не только через @Component:

  • Можно в каком-нибудь классе конфига крикнуть @EnableConfigurationProperties:
    @Configuration
    @EnableConfigurationProperties(MailProperties.class) // Вот так, и всё заведётся
    public class AppConfig { }
  • Или вообще бин вручную объявить — кому как нравится.

Что в этом охуенного, кроме очевидного?

  • Перезагрузка на лету: С @RefreshScope (это из Spring Cloud) можно менять конфиги в файле, и приложение, блядь, подхватит новые значения без перезапуска — волшебство, ёпта!
  • Сложные структуры: Вкладывай объекты в объекты, делай Map — всё свяжется, лишь бы геттеры/сеттеры были.
  • Конвертация: Сам понимает, что строка "30s" — это Duration в 30 секунд, а "10MB" — это DataSize. Даже свои конвертеры можно прикрутить, если совсем извращенец.
  • Подсказки в IDE: Генерирует метаданные, и когда в application.yml пишешь app.mail. — тебе выпадает список полей. Красота, а не жизнь.

И главное, почему это лучше, чем тыкать @Value везде: Всё в одном месте, валидация сразу, переиспользовать легко, и когда настроек овердохуища — не превращаешься в обезьяну с аннотациями.