Что такое Inversion of Control (IoC) в контексте Spring?

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

Ответ

Inversion of Control (IoC) – это принцип проектирования, при котором управление созданием объектов и связыванием зависимостей передается внешнему контейнеру (фреймворку), а не осуществляется самим кодом приложения.

В Spring IoC реализуется через Dependency Injection (DI) – механизм внедрения зависимостей в объекты.

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

  • Слабая связанность (Loose Coupling): Классы не создают свои зависимости напрямую.
  • Упрощение тестирования: Зависимости можно легко подменить моками.
  • Централизованное управление: Контейнер Spring управляет жизненным циклом бинов.

Пример внедрения зависимости через конструктор:

@Service
public class OrderService {
    private final PaymentProcessor paymentProcessor;

    // Контейнер IoC (Spring) создаст PaymentProcessor и внедрит его сюда
    public OrderService(PaymentProcessor paymentProcessor) {
        this.paymentProcessor = paymentProcessor;
    }

    public void processOrder(Order order) {
        paymentProcessor.charge(order.getAmount());
    }
}

@Component
public class PaymentProcessor {
    public void charge(BigDecimal amount) { /* ... */ }
}

Контейнер Spring (ApplicationContext) берет на себя ответственность за создание PaymentProcessor и его передачу в конструктор OrderService.