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

Какие преимущества у constructor injection по сравнению с field injection? Выберите все верные.

JuniorIoC и внедрение зависимостейSpring
Ещё спрашивают так:
  • Почему не стоит использовать @Autowired на полях?
Коротко

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

  • С одним конструктором @Autowired не нужен (Spring 4.3+)
  • Много параметров конструктора — сигнал, что класс делает слишком много
  • Циклические зависимости обнаруживаются при старте, а не прячутся

А ещё Lombok @RequiredArgsConstructor сокращает код

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

Подробно

Внедрение в поле (@Autowired private Repo repo;) работает через рефлексию после создания объекта. Проблемы:

  • поле не может быть final — объект изменяем;
  • объект можно создать через new в некорректном состоянии (поля null);
  • в тесте нельзя просто передать заглушку — нужен Spring или рефлексия;
  • зависимости скрыты: десять @Autowired-полей выглядят безобидно.

Внедрение через конструктор:

  • поля final — неизменяемость и безопасная публикация;
  • объект готов сразу после конструктора;
  • в unit-тесте — new OrderService(mockRepo);
  • длинный список параметров наглядно показывает, что у класса слишком много обязанностей;
  • циклическая зависимость падает при старте контекста (BeanCurrentlyInCreationException), а не маскируется.

С одним конструктором аннотация @Autowired не нужна с Spring 4.3.

Сеттер-внедрение — для действительно необязательных зависимостей.

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

  • Неизменяемость и готовность объекта.
  • Тестирование без контейнера.
  • Явность зависимостей и обнаружение циклов.

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

  • Ставить @Autowired на конструктор, когда он единственный, и считать это обязательным.

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

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

Показать варианты и ответ
  • ✓Позволяет объявлять зависимости как final
  • ✓Гарантирует полностью инициализированный объект сразу после создания
  • ✓Упрощает unit-тесты: зависимости передаются без Spring-контекста
  • ✗Позволяет внедрять зависимости в приватные поля без конструктора через рефлексию

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

  • Как тестировать бин без поднятия контекста?
  • Что делать с циклическими зависимостями?

Разбор темы

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

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

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

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

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