Этот вопрос проверяет понимание принципа Inversion of Control и того, как Spring управляет созданием и связями объектов.
IoC в Spring реализован через контейнер, который сам создает объекты и связывает их зависимости. Разработчик не управляет созданием зависимостей вручную, а описывает правила конфигурации. Контейнер читает эти правила и внедряет зависимости автоматически. Основной механизм реализации IoC в Spring — Dependency Injection. Это снижает связанность кода и упрощает тестирование.
Inversion of Control (IoC) — это принцип, при котором управление созданием объектов и их зависимостями передается внешнему контейнеру.
В обычном коде класс сам создает свои зависимости через new. В Spring этот контроль передается контейнеру, который:
создает объекты,
управляет их жизненным циклом,
внедряет зависимости.
Spring использует контейнер, основными реализациями которого являются:
BeanFactory — базовый контейнер.
ApplicationContext — расширенный контейнер, используемый чаще всего.
Контейнер читает конфигурацию:
Аннотации (@Component, @Service, @Repository)
Java-конфигурацию (@Configuration, @Bean)
XML (используется редко)
Spring поддерживает несколько способов Dependency Injection:
Через конструктор (рекомендуемый способ)
Через сеттеры
Через поля (не рекомендуется)
@Service
public class OrderService {
private final PaymentService paymentService;
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
В этом примере Spring сам:
создает PaymentService
передает его в OrderService
Контейнер управляет этапами:
Создание объекта
Внедрение зависимостей
Вызов init-методов
Использование
Уничтожение (если требуется)
IoC в Spring позволяет убрать жесткие зависимости между классами и переложить управление объектами на контейнер, что делает код гибким, тестируемым и расширяемым.