Получить доступ

Как соотносятся IoC и DI в Spring?

JuniorIoC и внедрение зависимостейSpring
Ещё спрашивают так:
  • Что такое инверсия управления?
  • Что такое внедрение зависимостей?
Коротко

IoC (инверсия управления) — принцип: объекты не создают свои зависимости и не управляют своим жизненным циклом, это делает контейнер. DI (внедрение зависимостей) — конкретный способ IoC: зависимости передаются объекту извне — через конструктор, сеттер или поле.

  • В Spring контейнер — ApplicationContext, управляемые объекты — бины
  • Код зависит от интерфейсов, конкретные реализации подставляет контейнер
  • Плюсы: слабая связанность, подмена реализаций в тестах, единая настройка

А ещё Другие формы IoC: шаблонный метод, колбэки, события

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Без IoC класс сам создаёт зависимости: new JdbcOrderRepository(new HikariDataSource(...)). Он знает о конкретных классах, их конфигурации и порядке создания; подменить базу в тесте сложно.

Инверсия управления — отдать эту ответственность внешнему коду: фреймворк создаёт объекты, связывает их и вызывает ваш код в нужный момент («не звоните нам, мы позвоним вам»).

Внедрение зависимостей — способ реализации: класс объявляет, что ему нужно (параметры конструктора), а контейнер передаёт готовые объекты.

@Service
class OrderService {
    private final OrderRepository repo;
    OrderService(OrderRepository repo) { this.repo = repo; }   // зависимость передана извне
}

Что даёт: класс зависит от абстракции, а не от реализации; в тесте передаётся заглушка без запуска контекста; конфигурация (какая реализация, какие параметры) собрана в одном месте; контейнер управляет жизненным циклом — singleton, закрытие ресурсов.

Способы внедрения: конструктор (рекомендуемый), сеттер (для необязательных зависимостей), поле (@Autowired на поле — удобно, но плохо для тестов и неизменяемости).

Что хотят услышать

  • Различие: IoC — принцип, DI — способ.
  • Пример класса до и после.
  • Что даёт: связанность, тесты, конфигурация.
  • Способы внедрения.

Частые ошибки

  • Считать IoC и DI синонимами без объяснения.
  • Называть Spring единственным способом делать DI.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓DI — это форма IoC: контейнер внедряет зависимости извне, а не объект создаёт их сам
  • ✗IoC — это частный случай DI
  • ✗Это полные синонимы
  • ✗IoC про базы данных, DI про web-слой

Что спросят дальше

  • Почему constructor injection лучше field injection?
  • Что такое scope бина?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем