Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем