Что меняет использование аннотации @Autowired в Spring?

«Что меняет использование аннотации @Autowired в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использование @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 через конструктор.