Что такое autowired в Spring
Что проверяют
Понимаете ли вы, что за аннотацией стоит контейнер. Спрашивают не определение, а механику: как Spring выбирает кандидата, что делает при нескольких подходящих бинах и почему способ внедрения влияет на тестируемость.
Как отвечать
Аннотация помечает точку внедрения: поле, конструктор или сеттер. При подъёме контекста контейнер ищет бин подходящего типа и подставляет его сам, а разработчик не вызывает конструкторы зависимостей руками.
Важная деталь, которую ценят: на единственном конструкторе аннотация в современных версиях Spring не нужна, контейнер внедряет через него по умолчанию. В новом коде её там обычно не пишут.
@Service
public class OrderService {
private final OrderRepository repo;
public OrderService(OrderRepository repo) {
this.repo = repo;
}
}Разрешение идёт по типу. Если подходящих бинов несколько, выбор уточняется через @Primary, через @Qualifier с именем бина или совпадением имени параметра с именем бина. Если не нашлось ни одного, а зависимость обязательна, контекст падает на старте, и это правильное поведение: лучше не подняться, чем получить NullPointerException под нагрузкой. Смягчается это через required со значением false или через Optional. Для параметра типа списка контейнер внедрит все бины нужного типа, порядок задаётся через @Order.
Где спотыкаются
Внедряют в поля и считают это нормой. Поле нельзя сделать final, зависимости не видны в сигнатуре, объект не собрать без контейнера в обычном юнит-тесте, а класс с десятком зависимостей тихо растёт вместо того, чтобы кричать распухшим конструктором.
Ждут внедрения в объекте, созданном через new. Контейнер обрабатывает только свои бины: у объекта, который вы создали сами, все точки внедрения останутся пустыми, и это самая частая причина загадочного null в сервисе.
Не знают, что делать с циклической зависимостью. На конструкторах контекст просто не поднимется, и правильный ответ обычно вынести общую логику в третий бин, а не глушить проблему ленивой инициализацией и сеттером.