Выбор ответа Junior IoC и внедрение зависимостей спрашивают часто обновлено

Почему внедрение через конструктор

Вопрос

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

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Зависимости обязательны и final, тестировать можно без контейнера. Конструктор делает зависимости явными: без них объект не создать, поля можно объявить final, а в юнит-тесте достаточно new Service(mock).

Варианты ответа

  1. Только при внедрении через конструктор работает @Transactional
  2. Зависимости обязательны и final, тестировать можно без контейнераправильный ответ
  3. Внедрение через поле запрещено начиная со Spring 6 и выдаёт ошибку старта
  4. Конструктор вызывается позже, чем внедряются поля, и видит их все

Разбор

Конструктор делает зависимости явными: без них объект не создать, поля можно объявить final, а в юнит-тесте достаточно new Service(mock). Внедрение в поля работает и в Spring 6, просто хуже по этим причинам. @Transactional зависит от прокси, а не от способа внедрения. Поля при field injection заполняются после конструктора, но это не довод в пользу конструктора.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.