Какие преимущества у constructor injection по сравнению с field injection? Выберите все верные.
- Почему не стоит использовать @Autowired на полях?
Внедрение через конструктор даёт final-поля, полностью готовый объект сразу после создания, явные зависимости и тесты без Spring — достаточно вызвать конструктор.
- С одним конструктором @Autowired не нужен (Spring 4.3+)
- Много параметров конструктора — сигнал, что класс делает слишком много
- Циклические зависимости обнаруживаются при старте, а не прячутся
А ещё Lombok @RequiredArgsConstructor сокращает код
Подробно
Внедрение в поле (@Autowired private Repo repo;) работает через рефлексию после создания объекта. Проблемы:
- поле не может быть
final— объект изменяем; - объект можно создать через
newв некорректном состоянии (поля null); - в тесте нельзя просто передать заглушку — нужен Spring или рефлексия;
- зависимости скрыты: десять
@Autowired-полей выглядят безобидно.
Внедрение через конструктор:
- поля
final— неизменяемость и безопасная публикация; - объект готов сразу после конструктора;
- в unit-тесте —
new OrderService(mockRepo); - длинный список параметров наглядно показывает, что у класса слишком много обязанностей;
- циклическая зависимость падает при старте контекста (BeanCurrentlyInCreationException), а не маскируется.
С одним конструктором аннотация @Autowired не нужна с Spring 4.3.
Сеттер-внедрение — для действительно необязательных зависимостей.
Что хотят услышать
- Неизменяемость и готовность объекта.
- Тестирование без контейнера.
- Явность зависимостей и обнаружение циклов.
Частые ошибки
- Ставить @Autowired на конструктор, когда он единственный, и считать это обязательным.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Позволяет объявлять зависимости как final
- ✓Гарантирует полностью инициализированный объект сразу после создания
- ✓Упрощает unit-тесты: зависимости передаются без Spring-контекста
- ✗Позволяет внедрять зависимости в приватные поля без конструктора через рефлексию
Что спросят дальше
- Как тестировать бин без поднятия контекста?
- Что делать с циклическими зависимостями?
Разбор темы
- IoC и Dependency Injection
Принцип инверсии управления, DI как его форма, три способа внедрения и почему конструктор, разрешение циклических зависимостей.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.