Sobes.tech
Назад к вопросам
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 требует явного указания, какой бин использовать, если их несколько для одного типа.