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

Почему внедрение через конструктор предпочтительнее внедрения в поле?

MiddleСтереотипы и автосвязываниеSpring
Ещё спрашивают так:
  • Чем плохо внедрение через поле?
Коротко

Конструктор даёт final-поля, тестируемость без контейнера и честный сигнал о раздутых зависимостях; поле прячет зависимости и позволяет создать объект в неполном состоянии.

  • Циклические зависимости через конструктор падают при старте — это полезно
  • Spring Boot 2.6+ запрещает циклы по умолчанию
  • Сеттер — только для необязательных зависимостей

А ещё Lombok @RequiredArgsConstructor убирает шаблонный код

Подробно

Внедрение в поле прячет зависимости: снаружи класса не видно, что ему нужно, а в тесте приходится поднимать контекст или лезть рефлексией. Конструктор делает контракт явным и позволяет объявить поля final, то есть объект не существует в недоинициализированном виде. Полезный побочный эффект — восемь параметров в конструкторе выглядят некрасиво, и это правильно: класс с восемью зависимостями действительно делает слишком много. Ещё одно отличие практическое: циклическая зависимость при внедрении через конструктор обнаруживается при старте, а не всплывает позже. Начиная со Spring 4.3 единственному конструктору аннотация @Autowired не нужна.

Что хотят услышать

  • Неизменяемость, тесты, явность.
  • Поведение при циклах.

Частые ошибки

  • Использовать внедрение в поле ради краткости и терять тестируемость.
  • Разрывать циклическую зависимость через @Lazy вместо пересмотра дизайна.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Поля можно сделать final — объект сразу полностью инициализирован
  • ✓Класс создаётся в тесте обычным new, без контейнера
  • ✓Длинный список параметров честно сигнализирует о нарушении SRP
  • ✗Только конструктор позволяет внедрить зависимость, объявленную интерфейсом, а не классом

Что спросят дальше

  • Что происходит с циклической зависимостью при разных видах внедрения?
  • Когда оправдано внедрение через сеттер?

Разбор темы

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

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

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

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

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