Sobes.tech
Middle — Middle+

Mis juhtub, kui sisestame sõltuvuse läbi liidese, mida teostavad kaks erinevat teostust, ja teeme selle sõltuvuse süstimise?

sobes.tech AI

Vastus AI-lt

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

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

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

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

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

Пример с @Qualifier:

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

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