Ответ
Использование @Autowired меняет способ, которым Spring разрешает и внедряет зависимости (Dependency Injection).
Что меняется по сравнению с явной конфигурацией:
Без @Autowired |
С @Autowired |
|---|---|
Зависимости объявляются явно в XML или Java-@Configuration. |
Spring автоматически находит подходящий бин в контексте. |
| Связи видны в конфигурационных файлах. | Связи определяются в самом коде класса. |
| Требует больше шаблонного кода. | Упрощает и сокращает конфигурацию. |
Как использовать:
@Component
public class OrderService {
// Внедрение по типу поля
@Autowired
private PaymentProcessor paymentProcessor;
// Внедрение через конструктор (рекомендуемый способ)
@Autowired
public OrderService(PaymentProcessor paymentProcessor) {
this.paymentProcessor = paymentProcessor;
}
// Внедрение через сеттер
@Autowired
public void setLogger(Logger logger) { /* ... */ }
}
Важные нюансы:
- Если есть несколько бинов-кандидатов одного типа, необходимо уточнение с помощью
@Qualifier("beanName"). - Начиная с Spring 4.3,
@Autowiredна единственном конструкторе можно опустить. - Чрезмерное использование на полях (
field injection) усложняет тестирование и скрывает зависимости. Предпочтительнее injection через конструктор.