Sobes.tech
Junior — Middle
101

Wie entscheidet Spring, welcher der beiden Beans desselben Typs mit unterschiedlichen Implementierungen bei der Dependency Injection verwendet wird?

Unternehmen wurden gefragt
СБЕРСБЕР

Antwort von AI

sobes.tech KI

Если в 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 или имени, либо выбрасывает ошибку при неоднозначности.