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

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

Ответ

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

Суть принципа: Классы не создают свои зависимости напрямую, а получают их извне.

Пример без IoC (жесткая связь):

class OrderService {
    // Зависимость создается внутри класса
    private OrderRepository repository = new JdbcOrderRepository();
}

Пример с IoC в Spring (слабая связь):

@Service // Объявляем класс как управляемый бин (компонент)
public class OrderService {
    // Зависимость внедряется контейнером
    private final OrderRepository repository;

    @Autowired // Контейнер Spring найдет подходящий бин и передаст его сюда
    public OrderService(OrderRepository repository) {
        this.repository = repository;
    }
}

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

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

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