Gymterview
junior

Что такое IoC и DI? В чём разница между ними?

IoC (Inversion of Control) – принцип проектирования, при котором управление созданием объектов и их жизненным циклом передаётся от самого приложения к фреймворку. DI (Dependency Injection) – конкретный паттерн реализации IoC, при котором зависимости «внедряются» в объект контейнером извне.

IoC – это философия, DI – способ её воплощения. DI – наиболее распространённая форма IoC.

Без IoC/DI (жёсткая связность)

Пример
public class OrderService {
    // OrderService сам создаёт свою зависимость -- жёсткая связь
    private OrderRepository repository = new OrderRepositoryImpl();

    public void createOrder(Order order) {
        repository.save(order);
    }
}

С IoC/DI (слабая связность)

Пример
@Service
public class OrderService {
    private final OrderRepository repository;

    // Зависимость внедряется контейнером через конструктор
    @Autowired
    public OrderService(OrderRepository repository) {
        this.repository = repository;
    }

    public void createOrder(Order order) {
        repository.save(order);
    }
}

Преимущества DI

  • Слабая связность – классы зависят от интерфейсов, а не от конкретных реализаций
  • Тестируемость – в тестах легко подставить мок вместо реальной зависимости
  • Гибкость – можно менять реализации без изменения кода клиента
  • Единая точка конфигурации – зависимости описаны в одном месте

Другие формы IoC (кроме DI)

  • Service Locator – объект сам запрашивает зависимости у специального реестра
  • Template Method – управление потоком передаётся родительскому классу
  • Event-driven – управление через события

На собеседовании: ключевая мысль – IoC это принцип, DI это реализация. Частая ошибка – говорить, что IoC и DI это одно и то же.