Sobes.tech
Back to questions
Middle — Middle+
55

Что происходит, если внедрять зависимость через интерфейс, который реализуют две разные реализации, и делать инъекцию этой зависимости?

Companies where asked
ЛанитЛанит

Answer from AI

sobes.tech AI

Если в систему внедрения зависимостей (например, Spring) передать интерфейс, который реализуют две разные реализации, и попытаться сделать инъекцию этой зависимости без дополнительной настройки, то возникнет неоднозначность — контейнер не сможет определить, какую именно реализацию нужно использовать.

Что происходит:

  • При попытке автосвязывания (autowiring) по типу интерфейса контейнер обнаружит несколько кандидатов.
  • Это приведёт к ошибке NoUniqueBeanDefinitionException или аналогичной, сообщающей, что найдено несколько бинов для одного типа.

Как решить проблему:

  • Использовать аннотацию @Qualifier для указания конкретного имени бина.
  • Назначить одну из реализаций как @Primary, чтобы она выбиралась по умолчанию.
  • Внедрять список или коллекцию всех реализаций, если нужно работать со всеми.

Пример с @Qualifier:

@Autowired
@Qualifier("firstImplementation")
private MyInterface myDependency;

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