Давайте посмотрим на готовые квалификаторы в CDI
В спецификации CDI объявлены три квалификатора — @Any, @Default, @New
- @Any : Думайте об этом как вездесущий квалификатор. Это там, даже если его нет 😉
- @Default : Как следует из названия, этот классификатор считается стандартным, если ни один из других квалификаторов не был конкретным. Единственное исключение из этого правила — использование квалификатора @Named (javax.inject).
- @New : Используется для получения нового экземпляра компонента по требованию. Новый экземпляр не зависит от области видимости. Это не рекомендуется с CDI 1.1
Вот несколько простых примеров:
Квалификаторы на уровне бина (класса)
01
02
03
04
05
06
07
08
09
10
11
12
|
//Explicit qualifier not specified, hence @Default is assumed public class CSVParser implements Parser{ //implementation ... } //Explicit qualifier specified @XMLParser public class XMLParser implements Parser{ //implementation ... } |
Квалификаторы в точке впрыска
01
02
03
04
05
06
07
08
09
10
11
12
|
public class ParsingService{ @Inject Parser parser //an implementation of the CSVParser class is injected (default behavior) //business logic } public class ParsingService{ @Inject @XMLParser Parser parser //an implementation of the XMLParser class is injected //business logic } |
Что такого особенного в @Any?
Как указывалось ранее, классификатор @Any вездесущ, т.е. он всегда есть, несмотря ни на что. Интересно, что если вы явно упомянете эту аннотацию, она открывает следующие опции
- У вас есть доступ ко всем возможным реализациям бина
010203040506070809101112
public
class
ParsingService{
@Inject
@Any
Instance<Parser> parsers;
//javax.enterprise.inject.Instance handles the magic behind the scenes
public
void
availableParsingOptions(){
for
(Parser parser : parsers){
System.out.println(
"Parser implementation class: "
+ parser.getConcreteImplName());
System.out.println(
"Supported format: "
+ parser.getSupportedFormat().getName());
}
}
}
- Он не подавляет bean-компонент по умолчанию (если есть) или любую из явных (квалифицированных) реализаций. Вы все еще можете искать их динамически (во время выполнения)
0102030405060708091011121314
public
class
ParsingService{
@Inject
@Any
Instance<Parser> parsers;
public
Parser chooseParser(){
//@XMLParser (qualifier annotation) being enforced programmatically
Parser selected = parsers.select(
new
XMLParserQualifier()).get();
return
(selected.isUnsatisfied() || selected.isAmbiguous()) ?
null
: selected;
}
//javax.enterprise.util.AnnotationLiteral project qualifiers as objects
private
static
class
XMLParserQualifier
extends
AnnotationLiteral<XMLParser>
implements
XMLParser{}
}
Это все, что нужно для ознакомления с квалификаторами CDI по умолчанию. Возможно, вы захотите проверить один из моих предыдущих постов об основах пользовательских квалификаторов в CDI
Ура!
Ссылка: | Собственные квалификаторы CDI: @Any и @Default от нашего партнера JCG Абхишека Гупты в блоге Object Oriented .. |