Вы должны разделить понятия создания экземпляра компонента и автоматического связывания.
Если класс A
, определенный как компонент (например, путем помещения в него @Component
), не может быть создан по какой-либо причине, контекст приложения не запустится, и точка. Это независимо от зависимостей самого компонента.
Теперь, если у вас есть bean-компоненты A
, bean-компоненты B
и bean-компоненты C
, у которых есть два кандидата на автоматическое связывание, то это выглядит так:
public interface I {}
@Component
public class A implements I {}
@Component
public class B implements I {}
@Component
public class C {
@Autowired
private I i;
}
В этом случае экземпляр класса C не будет создан, и весь контекст приложения потерпит неудачу, потому что Spring не будет знать, какую реализацию вам придется использовать в классе C (два кандидата для автоматического подключения).
В этом случае вам нужно дать подсказки Spring:
- с помощью аннотации
@Primary
- с помощью аннотации
@Qualifier
Таким образом, чтобы завершить процесс инициализации контекста приложения, он должен быть детерминированным и четко определенным.
person
Mark Bramnik
schedule
31.08.2020
A
. - person Steven   schedule 31.08.2020