Какие знаешь способы решения проблемы, если несколько Bean имплементируют один и тот же интерфейс в Spring

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

Ответ

В Spring есть несколько способов разрешения неоднозначности при внедрении бинов с одним интерфейсом:

  1. @Qualifier - явное указание имени бина:
@Autowired
@Qualifier("firstService")
private MyService myService;
  1. @Primary - пометить один бин как основной:
@Bean
@Primary
public MyService firstService() {
    return new FirstServiceImpl();
}
  1. Имя поля/параметра - Spring сопоставляет по имени:
@Autowired
private MyService firstService; // найдет бин с именем firstService
  1. @Resource (JSR-250) - внедрение по имени:
@Resource(name="secondService")
private MyService myService;
  1. Лямбда-выражение (в конфигурации):
@Bean
public SomeComponent component(Provider<MyService> provider) {
    return new SomeComponent(provider.get("secondService"));
}