Я какое-то время играл с @Qualifier
и его идеями, целенаправленно ломая логику соединений, идентификаторы компонентов, потенциальные компоненты, дублирующие квалификаторы и т. Д.
Я хотел бы знать: действительно ли @Qualifier
является идентификатором идентификатора компонента? или это что-то вроде Alias для бина, кроме идентификатора бина по умолчанию? Документация из @Qualifier
на самом деле ничего не говорит об этом или о чем-либо еще относительно отношения его элемента / атрибута к идентификатору компонента .. но:
Есть поведение, которое мне кажется довольно интересным:
Если у меня есть несколько @Component
классов, реализующих один interface A {..}
, и:
- Если я предоставлю один из этих компонентов с пользовательским идентификатором, например
@Component("myId")
, и если я попытаюсь внедрить этот компонент в другое место с @Autowired @Qualifier("myId")
- все будет работать нормально - это означает, что этот конкретный компонент квалифицирован различается и идентифицируется по его идентификатору;
(я предполагаю, что элемент @Component
("myId") является идентификатором компонента, хотя официальная документация @ Component's Необязательный Сводка элементов довольно однозначно для моего понимания)
- Если я, с другой стороны, предоставлю тот же компонент с
@Component @Qualifier("myId")
, а остальная часть сценария будет такой же - все все равно будет работать отлично.
Однако! , интересная часть, которую я наблюдал, состоит в том, что @Component("X")
устанавливает идентификатор соответствующего бина на X
, тогда как @Qualifier("Y")
не устанавливает идентификатор соответствующего бина на X
.
Если @Qualifier
является чем-то вроде псевдонима, что, если поле, которое должно быть введено, имеет @Qualifier("name")
для узких критериев, но доступны два bean-компонента, один с идентификатором name
и другой с Qualifier name
, который будет быть введенным?
Кто-нибудь мог бы пролить свет на то, как все это работает?