Назад к вопросам
СБЕР
Junior — Middle
65
Каким образом реализовать инъекцию зависимостей через бины, если существует несколько реализаций одного интерфейса?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Если в проекте есть несколько реализаций одного интерфейса, для инъекции зависимостей через бины в Spring можно использовать следующие подходы:
- Аннотация
@Qualifier— позволяет указать конкретный бин по имени или по кастомному квалификатору.
public interface Service {
void execute();
}
@Component("serviceA")
public class ServiceA implements Service {
public void execute() { /* реализация A */ }
}
@Component("serviceB")
public class ServiceB implements Service {
public void execute() { /* реализация B */ }
}
@Component
public class Client {
private final Service service;
@Autowired
public Client(@Qualifier("serviceA") Service service) {
this.service = service;
}
}
-
Использование имени бина — если бин объявлен с именем, можно указать его в
@Resource(name = "serviceA"). -
Использование кастомных аннотаций-квалификаторов — создаются свои аннотации с
@Qualifierдля более удобного и читаемого кода. -
Внедрение всех реализаций в коллекцию — если нужно работать со всеми реализациями сразу:
@Autowired
private List<Service> services;
Таким образом, выбор конкретной реализации происходит через @Qualifier или имя бина, что позволяет избежать неоднозначности при инъекции.