Статьи

Собственные CDI Qualifiers: @Any и @Default

Давайте посмотрим на готовые квалификаторы в 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 вездесущ, т.е. он всегда есть, несмотря ни на что. Интересно, что если вы явно упомянете эту аннотацию, она открывает следующие опции

  • У вас есть доступ ко всем возможным реализациям бина
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    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-компонент по умолчанию (если есть) или любую из явных (квалифицированных) реализаций. Вы все еще можете искать их динамически (во время выполнения)
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    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 ..