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