Вопрос с собеседования · Spring

Чем @ConfigurationProperties удобнее @Value для группы настроек?

MiddleApplicationContext и конфигурацияSpring Boot
Ещё спрашивают так:
  • Как типобезопасно читать настройки в 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?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования