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

Каким образом можно выбрать конкретный Bean среди нескольких одинаковых бинов в Spring без использования аннотации @Qualifier?

Компании, где спрашивали
Right Line

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

sobes.tech AI

Если в Spring-контейнере есть несколько бинов одного типа и нужно выбрать конкретный без использования аннотации @Qualifier, можно применить следующие подходы:

  1. Использование имени бина
    • При внедрении зависимости можно указать имя бина через параметр @Autowired вместе с @Resource или через метод с параметром имени.
@Autowired
public void setService(@Qualifier("beanName") MyService service) { ... }

Но так как @Qualifier использовать нельзя, можно применить:

@Resource(name = "beanName")
private MyService service;
  1. Внедрение всех бинов и выбор нужного вручную
@Autowired
private List<MyService> services;

public void useService() {
    MyService desired = services.stream()
        .filter(s -> s.getClass().getSimpleName().equals("MyDesiredService"))
        .findFirst()
        .orElseThrow();
    // использовать desired
}
  1. Использование @Primary

Если один бин пометить как @Primary, то он будет внедряться по умолчанию без необходимости указывать квалификатор.

@Primary
@Component
public class PrimaryService implements MyService { ... }
  1. Внедрение по имени через ApplicationContext

Можно получить бин напрямую из контекста по имени:

@Autowired
private ApplicationContext context;

public void useService() {
    MyService service = (MyService) context.getBean("beanName");
}

Таким образом, без @Qualifier можно использовать @Resource(name = "beanName"), @Primary, внедрять список бинов и выбирать нужный вручную или получать бин из контекста по имени.