Давайте посмотрим на готовые квалификаторы в 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 assumedpublic class CSVParser implements Parser{//implementation ...}//Explicit qualifier specified@XMLParserpublic 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
publicclassParsingService{@Inject@AnyInstance<Parser> parsers;//javax.enterprise.inject.Instance handles the magic behind the scenespublicvoidavailableParsingOptions(){for(Parser parser : parsers){System.out.println("Parser implementation class: "+ parser.getConcreteImplName());System.out.println("Supported format: "+ parser.getSupportedFormat().getName());}}} - Он не подавляет bean-компонент по умолчанию (если есть) или любую из явных (квалифицированных) реализаций. Вы все еще можете искать их динамически (во время выполнения)
0102030405060708091011121314
publicclassParsingService{@Inject@AnyInstance<Parser> parsers;publicParser chooseParser(){//@XMLParser (qualifier annotation) being enforced programmaticallyParser selected = parsers.select(newXMLParserQualifier()).get();return(selected.isUnsatisfied() || selected.isAmbiguous()) ?null: selected;}//javax.enterprise.util.AnnotationLiteral project qualifiers as objectsprivatestaticclassXMLParserQualifierextendsAnnotationLiteral<XMLParser>implementsXMLParser{}}
Это все, что нужно для ознакомления с квалификаторами CDI по умолчанию. Возможно, вы захотите проверить один из моих предыдущих постов об основах пользовательских квалификаторов в CDI
Ура!
| Ссылка: | Собственные квалификаторы CDI: @Any и @Default от нашего партнера JCG Абхишека Гупты в блоге Object Oriented .. |