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

Каким образом реализовать инъекцию зависимостей через бины, если существует несколько реализаций одного интерфейса?

Компании, где спрашивали
СБЕРСБЕР

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

sobes.tech AI

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

  1. Аннотация @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;
    }
}
  1. Использование имени бина — если бин объявлен с именем, можно указать его в @Resource(name = "serviceA").

  2. Использование кастомных аннотаций-квалификаторов — создаются свои аннотации с @Qualifier для более удобного и читаемого кода.

  3. Внедрение всех реализаций в коллекцию — если нужно работать со всеми реализациями сразу:

@Autowired
private List<Service> services;

Таким образом, выбор конкретной реализации происходит через @Qualifier или имя бина, что позволяет избежать неоднозначности при инъекции.