··boolean odd();
}
public enum Digits {
··TWO,
··EIGHT,
··TEN,
··THIRTEEN
}
Способ использования этого квалификатора не отличается от тех, которые вы видели раньше. Точка внедрения квалифицирует необходимую реализацию, располагая члены аннотации следующим образом:
@Inject @NumberOfDigits(value = Digits.THIRTEEN, odd = false)
private NumberGenerator numberGenerator;
Используемая реализация сделает то же самое:
@NumberOfDigits(value = Digits.THIRTEEN, odd = false)
public class IsbnEvenGenerator implements NumberGenerator {…}
Множественные квалификаторы. Другой способ квалифицировать компонент и точку внедрения — указать множественные квалификаторы. Так, вместо множественных квалификаторов для четности (@TwoOddDigits, @TwoEvenDigits) либо квалификатора, применяемого с членами (@NumberOfDigits), мы могли использовать два разных набора квалификаторов: один набор для четности (@Odd и @Even), другой — для количества цифр. Ниже приводится способ, которым вы можете квалифицировать генератор 13 четных чисел:
@ThirteenDigits @Even
public class IsbnEvenGenerator implements NumberGenerator {…}
Точка внедрения использовала бы тот же самый синтаксис:
@Inject @ThirteenDigits @Even
private NumberGenerator numberGenerator;
Тогда внедрению будет подлежать только компонент, имеющий обе аннотации квалификатора. Названия квалификаторов должны быть понятными. Для приложения важно, чтобы квалификаторы имели правильные имена и степень детализации.
Альтернативы
Квалификаторы позволяют выбирать между множественными реализациями интерфейса во время развертывания. Но иногда бывает целесообразно внедрить реализацию, зависящую от конкретного сценария развертывания. Например, вы решите использовать имитационный генератор чисел в тестовой среде.
Альтернативы — это компоненты, аннотированные специальным квалификатором javax.enterprise.inject.Alternative. По умолчанию альтернативы отключены, и чтобы сделать их доступными для инстанцирования и внедрения, необходимо активизировать их в дескрипторе beans.xml. В листинге 2.14 показана альтернатива имитационного генератора чисел.
@Alternative
public class MockGenerator implements NumberGenerator {
··public String generateNumber() {
····return "MOCK";
··}
}
Как видно из листинга 2.14, MockGenerator, как обычно, реализует интерфейс NumberGenerator. Он сопровождается аннотацией @Alternative, которая означает, что CDI обрабатывает его как альтернативу NumberGenerator по умолчанию. Как и в листинге 2.6, эта альтернатива по умолчанию могла бы использовать встроенный квалификатор @Default следующим образом:
@Alternative @Default
public class MockGenerator implements NumberGenerator {…}
Вместо альтернативы по умолчанию вы можете указать альтернативу с помощью квалификаторов. Например, следующий код сообщает CDI, что альтернатива тринадцатизначного генератора чисел — это имитация:
@Alternative @ThirteenDigits
public class MockGenerator implements NumberGenerator {…}
По умолчанию компоненты @Alternative отключены, и вам необходимо активизировать их явным образом в дескрипторе beans.xml, как показано в листинге 2.15.
·······xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"
·······xsi: schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
·
·
··························http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
·······version="1.1" bean-discovery-mode="all">
··
····
··
Что касается точки внедрения, ничего не меняется. Таким образом, на код вашего приложения ничто не влияет. Следующий отрывок кода содержит внедрение реализации генератора чисел по умолчанию. Если альтернатива активизирована, то MockGenerator, определенный в листинге 2.14, будет внедрен.
@Inject