Sobes.tech
Назад к вопросам
Junior — Middle
56

При наличии двух бинов одного типа с разными реализациями, каким образом Spring определяет, какой из них использовать при внедрении зависимостей?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Если в Spring-контейнере есть два бина одного типа с разными реализациями, то при внедрении зависимости без дополнительной информации возникает неоднозначность, и Spring выбросит исключение NoUniqueBeanDefinitionException.

Чтобы указать, какой бин использовать, применяются следующие подходы:

  1. Аннотация @Qualifier — позволяет явно указать имя нужного бина:
@Autowired
@Qualifier("beanName")
private MyService myService;
  1. Имя поля или параметра совпадает с именем бина — Spring пытается сопоставить по имени.

  2. Аннотация @Primary — помечает один из бинов как предпочтительный, если @Qualifier не указан:

@Bean
@Primary
public MyService primaryService() {
    return new MyServiceImpl1();
}

@Bean
public MyService secondaryService() {
    return new MyServiceImpl2();
}
  1. Использование коллекций — внедрить все бины данного типа в список или карту:
@Autowired
private List<MyService> services;

Таким образом, Spring определяет, какой бин использовать, исходя из явных указаний через @Qualifier, @Primary или имени, либо выбрасывает ошибку при неоднозначности.