Назад к вопросам
МТС
Senior
6
Как Spring резолвит бины, если несколько реализаций одного интерфейса?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Если в Spring-контейнере есть несколько реализаций одного интерфейса, то при автосвязывании по типу возникает неоднозначность. Spring резолвит бины следующим образом:
- Если используется аннотация
@Qualifier, то Spring выбирает бин с указанным именем или квалификатором. - Если один из бинов помечен как
@Primary, он будет выбран по умолчанию. - Если ни
@Qualifier, ни@Primaryне заданы, и есть несколько кандидатов, то при автосвязывании возникает исключениеNoUniqueBeanDefinitionException.
Пример:
public interface Service {
void execute();
}
@Component
@Primary
public class ServiceImpl1 implements Service {
public void execute() { /* реализация 1 */ }
}
@Component
public class ServiceImpl2 implements Service {
public void execute() { /* реализация 2 */ }
}
@Component
public class Client {
private final Service service;
@Autowired
public Client(Service service) {
this.service = service; // будет внедрен ServiceImpl1, т.к. он @Primary
}
}
Если нужно явно указать, какую реализацию использовать, применяют @Qualifier:
@Autowired
public Client(@Qualifier("serviceImpl2") Service service) {
this.service = service; // внедрится ServiceImpl2
}