Является ли Dependency Injection (DI) разновидностью Inversion of Control (IoC)?

«Является ли Dependency Injection (DI) разновидностью Inversion of Control (IoC)?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, абсолютно верно. Dependency Injection (DI, внедрение зависимостей) — это конкретная реализация более общего принципа Inversion of Control (IoC, инверсия управления).

  • IoC — это архитектурный паттерн, при котором управление потоком выполнения или созданием объектов передается от приложения внешнему контейнеру или фреймворку (например, Spring IoC Container).
  • DI — это механизм, реализующий IoC, при котором зависимости объекта предоставляются ему извне ("внедряются"), а не создаются самим объектом.

Пример IoC/DI в Spring:

// Без DI: объект сам управляет своей зависимостью (прямое создание).
public class OldService {
    private Repository repository = new RepositoryImpl(); // Прямое создание -> Нет IoC
}

// С DI: контейнер Spring управляет созданием и внедрением зависимости.
@Service
public class ModernService {
    private final Repository repository;

    // Контейнер Spring (IoC Container) создаст бин Repository и внедрит его сюда.
    @Autowired
    public ModernService(Repository repository) { // DI через конструктор
        this.repository = repository; // Управление инвертировано -> Есть IoC
    }
}

Таким образом, DI — это один из наиболее распространенных способов достижения IoC.