2013-08-17 4 views
0

Я не испытываю в EJB и CDI, и сейчас я пытаюсь понять некоторые основные принципы их использования и способы его использования. В частности, я хочу понять цель и использование Qualifiers, и я прочитал guide. Я не могу понять, насколько полностью, как Qualifier служит расширением интерфейса. Принимая в качестве примера пример в руководстве и в заявлении: «квалификатор подобен расширению интерфейса. Он не создает прямую зависимость от какой-либо конкретной реализации. Может быть несколько альтернативных реализаций @Asynchronous PaymentProcessor!», я полагаю, что можно сделать:Квалификатор как расширение интерфейса

@Asynchronous 

public class AsynchronousPaymentProcessor implements PaymentProcessor { 

    public void process(Payment payment) { ... } 

} 

и

@Asynchronous 

public class OtherAsynchronousPaymentProcessor implements PaymentProcessor { 

    public void process(Payment payment) { ... } 

} 

, а затем они пытаются внедрить как:

@Inject @Asynchronous PaymentProcessor asyncPaymentProcessor; 

Как это в данном случае определяется, что боб впрыскивается, так как оба аннотируются с тем же Qualifier? Или только несколько реализаций квалификатора относятся только к Alternatives?

Update-Complete:

Я прочитал соответствующие вопросы, а также. То, что я хочу, - это ответ без подробного описания: поскольку я могу ввести класс типа, который реализует интерфейс, в чем преимущество ввода типа интерфейса, а другое - для достижения свободной связи? Если я попробую приведенный выше код с реализациями 2 @Asynchronous, и я получаю исключение, то я делаю вывод, что он (несколько реализаций) доступен только с альтернативами. Я прав?

+0

Пожалуйста, взгляните на этот ответ, особенно раздел «Необходимы ли квалификаторы?«http://stackoverflow.com/questions/15231255/understanding-the-necessity-of-type-safety-in-cdi/15313148#15313148 – rdcrng

+0

Кроме того, ваш пример не соответствует правилу правильно, в этом случае вы получите исключение UnambiguousDependecyException.В руководстве у них есть два классификатора: @ Synchronous и @ @ Asynchronous. – rdcrng

+0

Или для примера, где они используют '@ Asynchronous' в обеих реализациях, они добавляют дополнительные квалификаторы. – rdcrng

ответ

0

Из спецификации, раздел 5.2:

боба отнесен к заданной точке впрыска, если:

  • Компонент имеет тип боба, который соответствует требуемому типу. С этой целью примитивные типы считаются соответствующими их типам-оболочкам в java.lang, и типы массивов считаются соответствующими только в том случае, если их типы элементов идентичны. Параметрированные и необработанные типы считаются совпадающими, если они идентичны или если тип бина назначается требуемому типу, как определено в разделе 5.2.3 «Назначение необработанных и параметризованных типов» или раздел 8.3.1 «Назначение сырья и параметризованные типы для точек ввода делегатов ».

  • Боб имеет все необходимые квалификаторы. Если явно не заданы требуемые квалификаторы, контейнер принимает необходимый классификатор @Default. Боб имеет необходимый квалификатор, если он имеет квалификатор с (а) того же типа и (б) одно и то же значение элемента аннотации для каждого элемента, который не аннотируется @ javax.enterprise.util.Nonbinding.

Короче говоря, контейнер выглядит для всех бобов, которые удовлетворяют тип точки впрыска, а затем впрыскивает один компонент, который, чей набор классификаторов соответствует набору классификаторов на момент впрыска. Если бит не подходит, вы получаете неудовлетворенные зависимости, или если несколько бобов совпадают, вы получаете однозначные зависимости.

+0

Это довольно близко. В CDI (на самом деле JSR 330), квалификаторы и тип объединенного объекта - это полный тип точки впрыска. Квалификаторы добавляют дополнительную информацию о мета-типе в точку впрыска. – LightGuard

+0

@LightGuard Итак, вы предпочли бы мне перефразировать, что контейнер просто соответствует типу точки впрыска к типу компонента, учитывая, что квалификаторы дополняют этот тип как для инъекции, так и для того, чтобы заявить, что контейнер первый матче s тип, затем квалификаторы, или это что-то еще? – rdcrng

+0

В каком именно контейнере это больше детализация реализации. Если все три реализации делают это так же, как просто совпадение, спецификация не обязана делать это определенным образом. Просто добавив дополнительные разъяснения. – LightGuard

Смежные вопросы