Назад к вопросам
СБЕР
Junior — Middle
66
Как Spring обрабатывает ситуацию, когда несколько Bean реализуют один и тот же интерфейс?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Когда в Spring контексте несколько бинов реализуют один и тот же интерфейс, и происходит попытка автосвязывания по типу (например, через @Autowired), возникает неоднозначность, так как Spring не знает, какой бин выбрать.
Как Spring обрабатывает эту ситуацию:
- Если не указано, какой бин использовать, будет выброшено исключение
NoUniqueBeanDefinitionException. - Чтобы решить проблему, можно:
- Использовать аннотацию
@Qualifierс указанием имени нужного бина. - Назначить один бин как
@Primary, тогда он будет выбран по умолчанию. - Внедрять коллекцию всех бинов данного типа (
List<Interface>,Map<String, Interface>), чтобы получить все реализации.
- Использовать аннотацию
Пример с @Qualifier:
@Autowired
@Qualifier("myServiceImpl")
private MyService myService;
Пример с @Primary:
@Service
@Primary
public class PrimaryServiceImpl implements MyService {
// реализация
}
Таким образом, Spring требует явного указания, какой бин использовать, если их несколько для одного типа.