Back to questions
СБЕР
Junior — Middle
55
При наличии двух бинов одного типа с разными реализациями, каким образом Spring определяет, какой из них использовать при внедрении зависимостей?
Companies where asked
Answer from AI
sobes.tech AI
Если в Spring-контейнере есть два бина одного типа с разными реализациями, то при внедрении зависимости без дополнительной информации возникает неоднозначность, и Spring выбросит исключение NoUniqueBeanDefinitionException.
Чтобы указать, какой бин использовать, применяются следующие подходы:
- Аннотация
@Qualifier— позволяет явно указать имя нужного бина:
@Autowired
@Qualifier("beanName")
private MyService myService;
-
Имя поля или параметра совпадает с именем бина — Spring пытается сопоставить по имени.
-
Аннотация
@Primary— помечает один из бинов как предпочтительный, если@Qualifierне указан:
@Bean
@Primary
public MyService primaryService() {
return new MyServiceImpl1();
}
@Bean
public MyService secondaryService() {
return new MyServiceImpl2();
}
- Использование коллекций — внедрить все бины данного типа в список или карту:
@Autowired
private List<MyService> services;
Таким образом, Spring определяет, какой бин использовать, исходя из явных указаний через @Qualifier, @Primary или имени, либо выбрасывает ошибку при неоднозначности.