Что делает аннотация @Autowired в Spring Framework?

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

Ответ

@Autowired — это аннотация Spring Framework, которая реализует механизм автоматического связывания зависимостей (Dependency Injection). Контейнер Spring (ApplicationContext) находит подходящий бин (компонент) и автоматически внедряет его в помеченное поле, конструктор или метод сеттера.

Способы применения:

  1. Внедрение в поле (наиболее распространено):
    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
    }
  2. Внедрение через конструктор (рекомендуемый способ):

    @Service
    public class UserService {
        private final UserRepository userRepository;
    
        @Autowired // Начиная с Spring 4.3, для единственного конструктора можно опустить
        public UserService(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
    }
  3. Внедрение через метод-сеттер.

Детали и управление:

  • Стратегия поиска: По умолчанию поиск осуществляется по типу (byType). Если найдено несколько бинов одного типа, будет выброшено исключение NoUniqueBeanDefinitionException.
  • Уточнение бина: Для разрешения неоднозначности используется аннотация @Qualifier("имяБина").
    @Autowired
    @Qualifier("jdbcRepository")
    private UserRepository repository;
  • Необязательная зависимость: Параметр required=false позволяет оставить зависимость неразрешенной (null), если бин не найден.
    @Autowired(required = false)
    private OptionalDependency dependency;

Альтернативные стандартные аннотации:

  • @Inject (JSR-330) — аналог @Autowired из стандарта Java.
  • @Resource (JSR-250) — осуществляет поиск сначала по имени, затем по типу.