Ответ 1
Вы можете использовать @Qualifier
вместе с @Autowired
. Фактически, Spring попросит вас явно выбрать компонент, если обнаружен неоднозначный тип компонента, и в этом случае вы должны предоставить квалификатор
.Например, в следующем случае необходимо предоставить квалификатор
@Component
@Qualifier("staff")
public Staff implements Person {}
@Component
@Qualifier("employee")
public Manager implements Person {}
@Component
public Payroll {
private Person person;
@Autowired
public Payroll(@Qualifier("employee") Person person){
this.person = person;
}
}
EDIT:
В Lombok 1.18.4, наконец, можно избежать шаблона при внедрении конструктора, когда у вас есть @Qualifier, поэтому теперь можно сделать следующее:
@Component
@Qualifier("staff")
public Staff implements Person {}
@Component
@Qualifier("employee")
public Manager implements Person {}
@Component
@RequiredArgsConstructor
public Payroll {
@Qualifier("employee") private final Person person;
}
при условии, что вы используете новое правило lombok.config copyableAnnotations из правила lombok (поместив следующее в lombok.config в корне вашего проекта):
# Copy the Qualifier annotation from the instance variables to the constructor
# see https://github.com/rzwitserloot/lombok/issues/745
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
Это было недавно введено в последней версии lombok 1.18.4.
- сообщение в блоге, где подробно обсуждается проблема
- оригинальный выпуск на github
- И небольшой проект GitHub, чтобы увидеть его в действии
Примечание
Если вы используете инъекцию поля или сеттера, тогда вы должны поместить @Autowired и @Qualifier поверх функции поля или сеттера, как показано ниже (любой из них будет работать)
public Payroll {
@Autowired @Qualifier("employee") private final Person person;
}
или
public Payroll {
private final Person person;
@Autowired
@Qualifier("employee")
public void setPerson(Person person) {
this.person = person;
}
}
Если вы используете инъекцию конструктора, аннотации должны быть помещены в конструктор, иначе код не будет работать. Используйте его, как показано ниже -
public Payroll {
private Person person;
@Autowired
public Payroll(@Qualifier("employee") Person person){
this.person = person;
}
}