Вопрос проверяет фундаментальное понимание принципа внедрения зависимостей, который является ядром Spring Framework.
Dependency Injection (DI) — это паттерн, при котором зависимости объекта не создаются им самим, а "внедряются" извне, обычно фреймворком. В Spring это означает, что контейнер Spring создает бины и автоматически подставляет нужные зависимости (через конструктор или поля) вместо того, чтобы объекты создавали их самостоятельно. Это делает код более гибким и удобным для тестирования.
Dependency Injection (DI, внедрение зависимостей) — это практика, при которой компонент получает свои зависимости от внешнего источника, а не создает их самостоятельно. Spring IoC (Inversion of Control) контейнер управляет этим процессом.
Основные способы внедрения в Spring:
Внедрение через конструктор (Constructor Injection): Рекомендуемый способ. Зависимости передаются в объект через его конструктор. Это гарантирует, что объект будет создан только с полностью инициализированными зависимостями.
@Service
public class OrderService {
private final PaymentService paymentService;
// Spring автоматически найдет бин PaymentService и внедрит его
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}Внедрение через поля (Field Injection): Зависимость помечается аннотацией @Autowired прямо над полем. Этот способ менее предпочтителен, так как усложняет тестирование (зависимость нужно подставлять через рефлексию).
@Service
public class OrderService {
@Autowired
private PaymentService paymentService;
}Как используется:
На практике вы создаете классы-сервисы, репозитории и другие компоненты, помечаете их аннотациями (@Service, @Repository и т.д.). Когда Spring создает бин, например, OrderService, он смотрит, какие зависимости ему нужны (например, PaymentService), находит соответствующий бин в своем контексте и передает его (внедряет) в OrderService.
Вывод:
DI упрощает разработку, уменьшая связность между компонентами. Внедрение через конструктор является наиболее предпочтительным и безопасным подходом.