Почему внедрение через конструктор предпочтительнее внедрения в поле?
- Чем плохо внедрение через поле?
Конструктор даёт final-поля, тестируемость без контейнера и честный сигнал о раздутых зависимостях; поле прячет зависимости и позволяет создать объект в неполном состоянии.
- Циклические зависимости через конструктор падают при старте — это полезно
- Spring Boot 2.6+ запрещает циклы по умолчанию
- Сеттер — только для необязательных зависимостей
А ещё Lombok @RequiredArgsConstructor убирает шаблонный код
Подробно
Внедрение в поле прячет зависимости: снаружи класса не видно, что ему нужно, а в тесте приходится поднимать контекст или лезть рефлексией. Конструктор делает контракт явным и позволяет объявить поля final, то есть объект не существует в недоинициализированном виде. Полезный побочный эффект — восемь параметров в конструкторе выглядят некрасиво, и это правильно: класс с восемью зависимостями действительно делает слишком много. Ещё одно отличие практическое: циклическая зависимость при внедрении через конструктор обнаруживается при старте, а не всплывает позже. Начиная со Spring 4.3 единственному конструктору аннотация @Autowired не нужна.
Что хотят услышать
- Неизменяемость, тесты, явность.
- Поведение при циклах.
Частые ошибки
- Использовать внедрение в поле ради краткости и терять тестируемость.
- Разрывать циклическую зависимость через @Lazy вместо пересмотра дизайна.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Поля можно сделать final — объект сразу полностью инициализирован
- ✓Класс создаётся в тесте обычным new, без контейнера
- ✓Длинный список параметров честно сигнализирует о нарушении SRP
- ✗Только конструктор позволяет внедрить зависимость, объявленную интерфейсом, а не классом
Что спросят дальше
- Что происходит с циклической зависимостью при разных видах внедрения?
- Когда оправдано внедрение через сеттер?
Разбор темы
- Стереотипы, @Bean и автосвязывание
Стереотипные аннотации и их семантика, @Bean против @Component, component-scan, @Autowired и разрешение неоднозначности.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.