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 это одно и то же.