Я не испытываю в 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
, и я получаю исключение, то я делаю вывод, что он (несколько реализаций) доступен только с альтернативами. Я прав?
Пожалуйста, взгляните на этот ответ, особенно раздел «Необходимы ли квалификаторы?«http://stackoverflow.com/questions/15231255/understanding-the-necessity-of-type-safety-in-cdi/15313148#15313148 – rdcrng
Кроме того, ваш пример не соответствует правилу правильно, в этом случае вы получите исключение UnambiguousDependecyException.В руководстве у них есть два классификатора: @ Synchronous и @ @ Asynchronous. – rdcrng
Или для примера, где они используют '@ Asynchronous' в обеих реализациях, они добавляют дополнительные квалификаторы. – rdcrng