Что делает аннотация @Autowired?
- Как Spring выбирает бин для @Autowired?
@Autowired — точка внедрения: контейнер находит бин по типу и подставляет. Несколько кандидатов — уточняют @Primary, @Qualifier или имя.
- На конструкторе, сеттере или поле; с одним конструктором аннотация не нужна
- Нет подходящего бина — ошибка старта (или Optional / required=false)
- Рекомендуется внедрение через конструктор
А ещё Внедрять можно и коллекции: List всех реализаций
Подробно
Важно не путать две вещи: регистрацию бина и его внедрение. Классом-бином объект делают стереотипы вроде @Component и @Service или метод с @Bean, а @Autowired лишь помечает место, куда контейнер должен что-то подставить. Поиск идёт по типу, и если подходящих бинов несколько, нужен @Qualifier или @Primary. Начиная со Spring 4.3 при единственном конструкторе аннотацию можно не писать вовсе — внедрение через конструктор происходит автоматически и считается предпочтительным.
Что хотят услышать
- Поиск по типу и разрешение неоднозначности.
- Где ставится и что если бина нет.
Частые ошибки
- Думать, что аннотация сама регистрирует класс как бин.
- Использовать внедрение в поле вместо конструктора.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Просит контейнер подставить подходящий бин в поле, конструктор или сеттер
- ✗Регистрирует класс как бин в контейнере, чтобы его можно было внедрять в другие
- ✗Создаёт новый экземпляр класса при каждом обращении
- ✗Открывает транзакцию на время выполнения метода
Что спросят дальше
- Что произойдёт, если подходящих бинов окажется несколько?
- Почему внедрение через конструктор предпочтительнее?
Разбор темы
- Стереотипы, @Bean и автосвязывание
Стереотипные аннотации и их семантика, @Bean против @Component, component-scan, @Autowired и разрешение неоднозначности.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.