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

Зачем нужен DI-контейнер

Вопрос

Зачем нужен DI и Spring-контейнер? Объясните на примере сервиса заказов.

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Возьмём OrderService, которому нужны репозиторий заказов и платёжный клиент. Без DI он сам создавал бы new JdbcOrderRepository(...) и new HttpPaymentClient(...): жёстко привязан к реализациям и настройкам, а в тесте не подменить.

Что должно прозвучать в ответе

  • Класс объявляет зависимости, а не создаёт их

  • Слабая связанность: зависимость от интерфейса

  • Простые юнит-тесты: мок через конструктор

  • Контейнер управляет жизненным циклом и скоупом

  • Контейнер добавляет сквозную функциональность через прокси: транзакции, кеш

Что могут спросить следом

  • Можно ли сделать DI без фреймворка?
  • Почему внедрение в поля считается плохой практикой?

Разбор

Возьмём OrderService, которому нужны репозиторий заказов и платёжный клиент. Без DI он сам создавал бы new JdbcOrderRepository(...) и new HttpPaymentClient(...): жёстко привязан к реализациям и настройкам, а в тесте не подменить. С DI сервис принимает в конструктор интерфейсы OrderRepository и PaymentClient, и ему всё равно, какие реализации придут. В тесте передаю моки без Spring. Контейнер берёт на себя создание объектов, их связывание, жизненный цикл и скоупы, а ещё оборачивает бины в прокси для транзакций, кеша и безопасности. DI можно делать и вручную, это просто передача зависимостей в конструктор, контейнер нужен, когда объектов сотни и есть сквозная функциональность.

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

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