使用CDI 2.0事件和带有类和限定符的@observesAsync,可以进一步优化哪些观察者通过某种运行时分配的属性得到通知?也就是说,是否可以通过使用唯一标识符来指定触发哪个单个观察者,或者是否所有观察者都必须查看事件并确定它是否适合他们?
答案 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
会收到awesome
和combined
次活动asyncObserver3
会收到tricky
和combined
次活动asyncObserver4
只会收到combined
事件最后但同样重要的是,我建议你瞥见CDI documentation以获得更深入的见解。