Sobes.tech
Back to questions
Junior — Middle
71

Как Spring определяет, какую реализацию интерфейса выбрать при использовании @Autowired, когда существует несколько вариантов

Companies where asked
Ifellow

Answer from AI

sobes.tech AI

Когда в Spring есть несколько реализаций одного интерфейса, и используется аннотация @Autowired, фреймворк пытается определить, какую именно реализацию внедрить, исходя из следующих правил:

  1. По имени бина: Spring ищет бин, имя которого совпадает с именем поля или параметра, куда происходит внедрение.
  2. Аннотация @Qualifier: Если есть несколько кандидатов, можно явно указать нужный бин с помощью @Qualifier("beanName").
  3. Аннотация @Primary: Если один из бинов помечен как @Primary, он будет выбран по умолчанию.
  4. Исключение при неоднозначности: Если ни одно из условий не помогает, Spring выбросит исключение NoUniqueBeanDefinitionException.

Пример:

@Component
@Primary
public class ServiceImpl1 implements MyService {}

@Component
public class ServiceImpl2 implements MyService {}

@Autowired
private MyService myService; // будет внедрена ServiceImpl1 из-за @Primary

@Autowired
@Qualifier("serviceImpl2")
private MyService myService2; // явно указана ServiceImpl2