Ответ
@Autowired — это аннотация Spring Framework, которая реализует механизм автоматического связывания зависимостей (Dependency Injection). Контейнер Spring (ApplicationContext) находит подходящий бин (компонент) и автоматически внедряет его в помеченное поле, конструктор или метод сеттера.
Способы применения:
- Внедрение в поле (наиболее распространено):
@Service public class UserService { @Autowired private UserRepository userRepository; } -
Внедрение через конструктор (рекомендуемый способ):
@Service public class UserService { private final UserRepository userRepository; @Autowired // Начиная с Spring 4.3, для единственного конструктора можно опустить public UserService(UserRepository userRepository) { this.userRepository = userRepository; } } - Внедрение через метод-сеттер.
Детали и управление:
- Стратегия поиска: По умолчанию поиск осуществляется по типу (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) — осуществляет поиск сначала по имени, затем по типу.