Чем @ConfigurationProperties удобнее @Value для группы настроек?
- Как типобезопасно читать настройки в Spring Boot?
@ConfigurationProperties связывает целый префикс настроек с типизированным объектом: вложенные структуры, списки, Duration и DataSize, валидация при старте, подсказки в IDE. @Value — для одиночных значений.
- Record или неизменяемый класс — привязка через конструктор
@Validated+ аннотации Bean Validation: неверная настройка роняет старт, а не прод ночью- Включение:
@ConfigurationPropertiesScanили@EnableConfigurationProperties
А ещё spring-boot-configuration-processor генерирует метаданные для автодополнения
Подробно
@Value удобен для одного значения, но с группой настроек неудобен: строки-ключи разбросаны по коду, нет вложенности, ошибки типа видны поздно.
@ConfigurationProperties:
@Validated
@ConfigurationProperties(prefix = "payments")
public record PaymentsProperties(
@NotNull URI baseUrl,
@DefaultValue("5s") Duration timeout,
@Min(1) int retries,
Map<String, String> headers) {}
payments:
base-url: https://api.pay.ru
timeout: 3s
retries: 2
Плюсы: один объект на группу настроек, внедряется как бин; типы Duration, DataSize, перечисления, списки, карты; валидация при старте контекста; relaxed binding; метаданные для автодополнения в IDE.
Регистрация: @ConfigurationPropertiesScan на главном классе или @EnableConfigurationProperties(PaymentsProperties.class).
Что хотят услышать
- Связывание префикса с объектом.
- Типы, вложенность, валидация при старте.
- Когда достаточно @Value.
Частые ошибки
- Разбрасывать десятки @Value с одинаковым префиксом по коду.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Читает значения быстрее в рантайме, потому что не использует рефлексию
- ✓Привязывает группу свойств к типобезопасному объекту с валидацией
- ✗Это единственный способ читать вложенные свойства из application.yml
- ✗Не требует геттеров и сеттеров, а также проверяет типы ещё при компиляции
Что спросят дальше
- Как включить валидацию свойств?
- Что такое relaxed binding?
Разбор темы
- ApplicationContext и конфигурация
BeanFactory против ApplicationContext, способы конфигурации, @Configuration full/lite, профили и Environment, @Conditional.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.