Как Spring определяет, какую зависимость внедрить при использовании @Autowired?

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

Ответ

Spring, в первую очередь, ориентируется на тип (класс/интерфейс) зависимости. Если найдено несколько бинов подходящего типа, требуется дополнительная квалификация.

Стратегии разрешения неоднозначности:

  1. @Qualifier("имя_бина") — явное указание имени требуемого бина.
    @Autowired
    @Qualifier("mysqlRepository")
    private UserRepository repository;
  2. @Primary — пометка одного бина как предпочтительного среди нескольких того же типа.
  3. Имя поля — если имя поля переменной совпадает с именем одного из бинов-кандидатов.

Best Practice: Всегда объявляйте зависимости через интерфейсы. Конкретную реализацию определяйте в конфигурации с помощью @Qualifier или @Primary, что делает код гибким и тестируемым.