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;
Таким образом, при наличии нескольких реализаций интерфейса необходимо явно указать, какую именно использовать, чтобы избежать конфликтов при инъекции.