Как можно применить dependency injection с использованием Spring Bean?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Spring Boot поддерживает DI тремя основными способами:
-
Injection by Field:
Наиболее распространенный и простой способ. Использование@Autowiredнад полем. Не рекомендуется для продакшн-кода из-за сложностей с тестированием и инкапсуляцией.// Field Injection @Service public class MyService { @Autowired private MyDependency dependency; public void doSomething() { dependency.execute(); } } -
Injection by Setter:
Использование@Autowiredнад сеттером. Позволяет опциональность зависимости (если сеттер может не вызываться) и облегчает тестирование.// Setter Injection @Service public class MyService { private MyDependency dependency; @Autowired public void setDependency(MyDependency dependency) { this.dependency = dependency; } public void doSomething() { dependency.execute(); } } -
Injection by Constructor:
Наиболее рекомендуемый способ. Использование@Autowiredнад конструктором. Обеспечивает неизменяемость зависимости после создания объекта и четко указывает на обязательные зависимости. В Spring Boot 2.x+@Autowiredнад единственным конструктором можно опустить.// Constructor Injection @Service public class MyService { private final MyDependency dependency; // @Autowired is optional for a single constructor in Spring Boot 2.x+ public MyService(MyDependency dependency) { this.dependency = dependency; } public void doSomething() { dependency.execute(); } }
Spring контейнер сканирует классы с аннотациями вроде @Component, @Service, @Repository, @Controller и создает из них Bean'ы. Когда Bean с аннотацией @Autowired на поле, сеттере или конструкторе обнаруживает необходимость в другой зависимости, контейнер ищет подходящий Bean по типу и/или имени и внедряет его. Если есть несколько подходящих Bean'ов, можно использовать @Qualifier для уточнения.