Ответ
@ConfigurationProperties — это механизм в Spring Boot для типобезопасной привязки свойств из внешних источников (.properties, .yml, переменные окружения) к Java-объектам.
Базовый пример:
- Создание класса-держателя свойств:
@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; } // ... остальные геттеры/сеттеры } - Определение свойств в
application.yml:app: mail: host: smtp.example.com port: 465 auth-enabled: true recipients: - admin@example.com - alert@example.com -
Использование в сервисе:
@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 в каждую дырку, как последний распиздяй.
Смотри, как это просто, ёпта:
- Леплю класс, куда всё сложу:
@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; } // ... и так по всем полям, скука, но надо } - В
application.ymlпишу настройки, как бог на душу положит:app: mail: host: smtp.example.com port: 465 auth-enabled: true # Заметь, в коде camelCase (authEnabled), а тут через чёрточку — Spring сам разберётся, хитрая жопа! recipients: - admin@example.com - alert@example.com -
А потом в сервисе просто беру и юзаю, как родную:
@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 везде: Всё в одном месте, валидация сразу, переиспользовать легко, и когда настроек овердохуища — не превращаешься в обезьяну с аннотациями.