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

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

Ответ

В контексте Spring Framework, IoC (Inversion of Control) — это фундаментальный принцип, при котором контейнер Spring (ApplicationContext) берет на себя управление жизненным циклом объектов (бинов), их созданием и связыванием зависимостей. Код приложения не создает объекты напрямую через new, а получает готовые, сконфигурированные бины из контейнера.

Практическая реализация IoC в Spring — это Dependency Injection (DI).

Пример: переход от жесткой связности к IoC/DI

// БЕЗ IoC (Жесткая связь - плохо для тестов и модификаций)
public class OrderService {
    private OrderRepository repository = new JdbcOrderRepository(); // Зависимость создается внутри
    // ...
}

// С IoC/DI в Spring (Гибкая связь через конструктор)
@Component
public class OrderService {
    private final OrderRepository repository;

    // Контейнер Spring внедрит (inject) нужную реализацию OrderRepository
    @Autowired
    public OrderService(OrderRepository repository) {
        this.repository = repository;
    }
    // ...
}

// Конфигурация бина репозитория (например, через аннотацию)
@Repository
public class JdbcOrderRepository implements OrderRepository { /* ... */ }

Ключевые моменты и преимущества Spring IoC:

  • Управление зависимостями: Контейнер автоматически разрешает и внедряет зависимости между бинами.
  • Слабая связанность: Классы зависят от абстракций (интерфейсов), а не от конкретных классов.
  • Упрощение тестирования: Можно легко подменить бины mock-объектами, используя, например, @MockBean в Spring Boot тестах.
  • Централизованная конфигурация: Определение бинов и их связей происходит в одном месте (через аннотации @Component, @Service, @Repository, XML или Java-based конфигурацию).
  • Управление жизненным циклом: Контейнер управляет созданием, инициализацией (@PostConstruct) и уничтожением бинов.