Back to questions
Junior — Middle
91
Каким образом можно выбрать конкретный Bean среди нескольких одинаковых бинов в Spring без использования аннотации @Qualifier?
Companies where asked
Right Line
Answer from AI
sobes.tech AI
Если в Spring-контейнере есть несколько бинов одного типа и нужно выбрать конкретный без использования аннотации @Qualifier, можно применить следующие подходы:
- Использование имени бина
- При внедрении зависимости можно указать имя бина через параметр
@Autowiredвместе с@Resourceили через метод с параметром имени.
- При внедрении зависимости можно указать имя бина через параметр
@Autowired
public void setService(@Qualifier("beanName") MyService service) { ... }
Но так как @Qualifier использовать нельзя, можно применить:
@Resource(name = "beanName")
private MyService service;
- Внедрение всех бинов и выбор нужного вручную
@Autowired
private List<MyService> services;
public void useService() {
MyService desired = services.stream()
.filter(s -> s.getClass().getSimpleName().equals("MyDesiredService"))
.findFirst()
.orElseThrow();
// использовать desired
}
- Использование
@Primary
Если один бин пометить как @Primary, то он будет внедряться по умолчанию без необходимости указывать квалификатор.
@Primary
@Component
public class PrimaryService implements MyService { ... }
- Внедрение по имени через
ApplicationContext
Можно получить бин напрямую из контекста по имени:
@Autowired
private ApplicationContext context;
public void useService() {
MyService service = (MyService) context.getBean("beanName");
}
Таким образом, без @Qualifier можно использовать @Resource(name = "beanName"), @Primary, внедрять список бинов и выбирать нужный вручную или получать бин из контекста по имени.