Middle — Middle+
İki fərqli həyata keçirilmə ilə həyata keçirilən interfeys vasitəsilə asılılığı daxil etsək və bu asılılığı inyeksiya etsək, nə baş verir?
sobes.tech Süni İntellekt
AI-dan cavab
Если в систему внедрения зависимостей (например, Spring) передать интерфейс, который реализуют две разные реализации, и попытаться сделать инъекцию этой зависимости без дополнительной настройки, то возникнет неоднозначность — контейнер не сможет определить, какую именно реализацию нужно использовать.
Что происходит:
- При попытке автосвязывания (autowiring) по типу интерфейса контейнер обнаружит несколько кандидатов.
- Это приведёт к ошибке
NoUniqueBeanDefinitionExceptionили аналогичной, сообщающей, что найдено несколько бинов для одного типа.
Как решить проблему:
- Использовать аннотацию
@Qualifierдля указания конкретного имени бина. - Назначить одну из реализаций как
@Primary, чтобы она выбиралась по умолчанию. - Внедрять список или коллекцию всех реализаций, если нужно работать со всеми.
Пример с @Qualifier:
@Autowired
@Qualifier("firstImplementation")
private MyInterface myDependency;
Таким образом, при наличии нескольких реализаций интерфейса необходимо явно указать, какую именно использовать, чтобы избежать конфликтов при инъекции.