jakarta ee-CDI,是否可以通过添加限定符属性来筛选@ObserveSync



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

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

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

它是-使用一个不触发任何其他观察者的唯一限定符。它并不像所有观察者那样"观察"事件。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事件
  • trickycombined事件将通知asyncObserver3
  • asyncObserver4将只收到combined事件的通知

最后但同样重要的是,我建议您浏览一下CDI文档,以获得更深入的了解。

最新更新