当前位置: 首页 > 知识库问答 >
问题:

如果所有事件都有@any作为限定符,那么观察一个没有限定符的事件意味着什么?

慕容耘豪
2023-03-14

CDI规范在第10.1节中规定:

每个事件[对象]都有限定符@jakarta.enterprise.inject.任何,即使它没有显式声明这个限定符。

(术语很重要;这是规范中讨论事件对象的一部分,即可以通过观察者方法观察到的事件,即有效载荷,而不是用于触发事件对象的名称不正确的事件对象。)

然后在第10.4.1节中,谈到观察者方法及其参数,它说:

如果事件参数[观察者方法]没有显式声明任何限定符,观察者方法观察没有限定符的事件。

(这可能是将其与“普通”注入区分开来的,在“普通”注入中,如果不在注入点上添加限定符,则默认情况下会得到@Default;在这种情况下,规范规定不适用类似的默认值。)

撇开观察者解析的工作方式不谈(在第10.3节中讨论),在第10.1节中,是否存在事件对象没有限定符的情况?或者第10.4.1节只是一个关于自动应用于方法参数的限定符(即无)的声明?

共有2个答案

郑俊美
2023-03-14

每个事件[对象]都有限定符@jakarta。企业注射任何,即使它没有显式声明此限定符。

这个声明基本上是观察者决议(10.3)的准备基础,并且是您引用的10.4.1声明工作所必需的。

在引擎盖下,总是有限定符-至少@Any,这也解释了为什么您的观察员(例如,String类型和“无限定符”(从用户代码视图)会收到关于String类型的每个事件的通知,而不管事件负载限定符如何。

你引用的规范措辞基本上是一个脚手架,允许CDI表达当用户不指定限定符时会发生什么,而实际上在适当的时候在后台添加它们,然后执行解析。

要明白我的意思,试着用这些观察者做实验:

    public void observe(@Observes String payload) {
        observerTriggered++; // assuming you are counting the triggers...
    }

    public void observe2(@Observes @Any String payload) {
        observerTriggered2++;
    }

    public void observe3(@Observes @Default String payload) {
        observerTriggered3++;
    }

    public void observe4(@Observes @DummyQualifier("foo") String payload) {
        observerTriggered4++;
    }

并触发以下事件并观察触发的观察者:

        Event<Object> event = // retrieve the event object somehow
        event.select(String.class).fire("irrelevantPayload");
        event.select(String.class, Any.Literal.INSTANCE).fire("irrelevantPayload");
        event.select(String.class, Default.Literal.INSTANCE).fire("irrelevantPayload");
        event.select(String.class, new DummyQualifier.Literal("foo")).fire("irrelevantPayload");
高飞翮
2023-03-14

就我对规范的解释而言,第10.4.1节中的部分

如果事件参数[观察者方法]没有显式声明任何限定符,观察者方法观察没有限定符的事件。

使第10.3节中的第三个要点生效:

如果[…]observer方法没有事件限定符[…]

因此,观察者方法接收带有@any限定符的事件。

 类似资料:
  • 阅读的javadocs,我看到方法让我知道事件是否由其结果重复。 返回事件计数。如果事件计数大于1,则这是一个重复事件。 这到底是什么意思?这是否意味着两个或多个对象引用同一个“事件”(例如,正在创建的文件)? 我正在Oracle网站上试验新的API的示例,这一部分让我感到困惑,尤其是因为我会在同一测试代码的连续运行中获得不同数量的事件(其中我使用写入一个文件,而不与之手动交互),但的结果永远不会

  • 我目前正在做一个JavaFX突围游戏,并建立了一个移动系统,该系统使用公共的userKeyInteraction方法,在我按下左右箭头键时设置蝙蝠对象的速度。这个方法看起来工作得很好,但是我也有一个keyReleased方法,当用户不再按任何一个箭头时,这个方法不仅对bat没有影响(当键被释放时它不会停止),而且根本检测不到keyReleased事件。 正如您在上面看到的,我已经使用debug.t

  • 这是关于在服务工作者内部处理事件时的一些行为。 当在事件处理程序中调用了获取()时,获取事件似乎不会再次被触发。这实际上很好,但我仍然想知道为什么没有发生。 我看了https://developers.google.com/web/ilt/pwa/caching-files-with-service-worker#on_network_response代码如下: 我自己也尝试过这段代码,调用(就在

  • 问题内容: 乔什·布洛赫(Josh Bloch)在“ 有效的Java ”项目“项目22:相比于非静态偏爱静态成员类”中,说: 非静态成员类的每个实例都与其包含类的封闭实例隐式关联。在非静态成员类的实例方法中,可以使用限定的this构造在封闭实例上调用方法或获取对封闭实例的引用。 他所说的“ 合格的结构” 是什么意思? 问题答案: 没有限定词,将递归。使用限定符时,将调用封闭实例的方法。

  • 在JavaScript中,我按住两个键,并且被完美触发。当我释放其中一个键时,被触发。到目前为止一切都很好。但是我仍然按住一个键,那么为什么没有被触发呢?我需要在我的游戏中发生这种情况。我做错了什么吗?这是预期的反应吗?有什么解决办法吗?

  • 问题内容: 我正在尝试在JBoss AS6的后端服务中使用CDI事件-理想情况下具有最大的代码复用率。 我可以从文档中看到,通过使用带有成员的限定符,可以减少必须创建的限定符注释类,例如 我可以用 到现在为止还挺好。但是,为了进一步减少所需的类数,我想拥有一个EventFirer类,该类中抛出的事件的限定符是动态的。没有成员的限定词不是问题: 然后叫 但是,什么时候限定词应该有成员呢?查看Anno