Sobes.tech
Назад к вопросам
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
}