CDI,是否可以通过添加限定符属性来过滤@ObservesAsync?

时间:2016-08-04 21:18:08

标签: java-ee cdi

使用CDI 2.0事件和带有类和限定符的@observesAsync,可以进一步优化哪些观察者通过某种运行时分配的属性得到通知?也就是说,是否可以通过使用唯一标识符来指定触发哪个单个观察者,或者是否所有观察者都必须查看事件并确定它是否适合他们?

1 个答案:

答案 0 :(得分:3)

实现所需行为的典型方法是使用限定符

  

...是否可以通过使用唯一标识符来指定触发哪个单个观察者...

它是 - 使用唯一的限定符,不会触发任何其他观察者。 它不适用于所有观察者“观察”事件的方式。 CDI将对此进行过滤,并仅将其传递到与您触发的事件相关的子集。

以下是事件和观察者如何使用限定符的相当详细的示例;请注意,这可以通过同步和异步事件完成。 与注入点相同,事件可以具有限定符。假设您有以下事件:

@Inject Event<MyPayload> basic;
@Inject @Awesome Event<MyPayload> awesome;
@Inject @Tricky Event<MyPayload> tricky;
@Inject @Awesome @Tricky Event<MyPayload> combined;

为简单起见,让我们坚持只通过<eventName>.fireAsync(new MyPayload())解雇这些事件。 现在对于观察者来说 - 那些也可以有限定词。限定符集确定将通知哪些事件。所以这里有一群观察者:

public void asyncObserver1(@ObservesAsync MyPayload event)
public void asyncObserver2(@ObservesAsync @Awesome MyPayload event)
public void asyncObserver3(@ObservesAsync @Tricky MyPayload event)
public void asyncObserver4(@ObservesAsync @Awesome @Tricky MyPayload event)

现在将向哪个观察者通知哪个事件。一般规则是 - 如果观察者限定符集是被触发事件的限定符的子集或空集

,则会通知观察者方法

假设您解雇了上述事件:

  • asyncObserver1会收到所有这些事件的通知,因为它的一组限定符是空的
  • asyncObserver2会收到awesomecombined次活动
  • 的通知
  • asyncObserver3会收到trickycombined次活动
  • 的通知
  • asyncObserver4只会收到combined事件
  • 的通知

最后但同样重要的是,我建议你瞥见CDI documentation以获得更深入的见解。