Middle — Middle+
Was passiert, wenn man eine Abhängigkeit über eine Schnittstelle einführt, die von zwei verschiedenen Implementierungen realisiert wird, und diese Abhängigkeit injiziert?
sobes.tech KI
Antwort von AI
Если в систему внедрения зависимостей (например, Spring) передать интерфейс, который реализуют две разные реализации, и попытаться сделать инъекцию этой зависимости без дополнительной настройки, то возникнет неоднозначность — контейнер не сможет определить, какую именно реализацию нужно использовать.
Что происходит:
- При попытке автосвязывания (autowiring) по типу интерфейса контейнер обнаружит несколько кандидатов.
- Это приведёт к ошибке
NoUniqueBeanDefinitionExceptionили аналогичной, сообщающей, что найдено несколько бинов для одного типа.
Как решить проблему:
- Использовать аннотацию
@Qualifierдля указания конкретного имени бина. - Назначить одну из реализаций как
@Primary, чтобы она выбиралась по умолчанию. - Внедрять список или коллекцию всех реализаций, если нужно работать со всеми.
Пример с @Qualifier:
@Autowired
@Qualifier("firstImplementation")
private MyInterface myDependency;
Таким образом, при наличии нескольких реализаций интерфейса необходимо явно указать, какую именно использовать, чтобы избежать конфликтов при инъекции.