当前位置: 首页 > 面试题库 >

是否可以使Spring ApplicationListener侦听2种或更多类型的事件?

越季萌
2023-03-14
问题内容

我有2种不同类型的事件,我希望我的班级能够监听并相应地(和不同地)进行处理。

我试过了: public class ListenerClass implements ApplicationListener<Foo>, ApplicationListener<Bar>

这给了我一个错误,即您无法使用不同的参数两次实现相同的接口。

除了实现ApplicationEvent的侦听器(或Foo和Bar将实现的某些其他公共接口)并instanceof用于确定采用哪种路径之外,我还有其他选择吗?

谢谢!


问题答案:

请参阅此答案结尾的Spring 4.2更新!

春季 <4.2

并不是的。

您可以为参数(例如ApplicationEvent)使用公共超类,也可以使用Foo和Bar实现的公共接口,然后必须自行调整它。

public class ListenerClass implements ApplicationListener<ApplicationEvent> {
    ...
    if(event instanceOf Foo || event instance of Bar) {
    }
}

另一种方法是使用两个应用程序监听器

public class ListenerClass {

    void onFoo(Foo foo){}
    void onBar(Bar bar){}

    static class FooListener implements ApplicationListener<Foo> {
       ListenerClass listerner;
       ....
       public void onApplicationEvent(Foo foo) {
           listener.onFoo(foo);
       }
    }
    static class BarListener implements ApplicationListener<Bar> {
       ListenerClass listerner;
       ....
       public void onApplicationEvent(Bar bar) {
           listener.onBar(bar);
       }
    }
}

重要提示: 所有3个实例都必须是四季豆!

当然,您可以自己实现此类功能。您至少有两个不同的选择,使它们基于spring事件调度程序框架,或者将其完全分开。对于第二个选择,请防御性地看一下CDI-
Event Mechanim,并可以搜索一些弹簧端口。

几年前(我猜是在2007/2008年),我已经靠自己实现了第一选择。我有一个负责听所有事件的事件调度程序。它是通过XML文件配置的。此xml文件包含“引用”!Bean中应分派的每个事件的方法-
该方法将通过反射调用。因此,有可能拥有强大的类型化事件处理程序方法(这是该方法的目的),但也可能在一个类中具有多个处理程序方法。如今,我将跳过xml文件,并使用注释和Bean后处理器

Spring 4.2 更新

Spring 4.2将具有改进的事件侦听器配置(基于注释),这使得在一个bean中具有两个不同的事件侦听器方法成为可能。

@Component
public class ListenerClass {

  @EventListener
  public void handleFooEvent(Foo fooEvent) {...}

  @EventListener
  public void handleBarEvent(Bar barEvent) {...}

}


 类似资料:
  • 问题内容: 是否可以在jQuery中创建可以绑定到任何样式更改的事件侦听器?例如,如果我想在元素更改尺寸或对style属性进行任何其他更改时“执行”操作,则可以执行以下操作: 这将非常有用。 有任何想法吗? 更新 很抱歉自己回答这个问题,但是我写了一个可能适合其他人的简洁解决方案: 这将临时覆盖内部prototype.css方法,并在最后使用触发器重新定义它。所以它是这样的: 问题答案: 由于jQ

  • 服务工作者中的事件监听器函数似乎是从实现的 这是典型的'提取类型'在一个服务工作者 我想知道我是否可以在服务人员中使用这些“类型”中的任何一种。 从这里:https://developer.mozilla.org/en-US/docs/Web/Events,我可以看到几种类型的事件侦听器,如点击或在线等... 服务人员接受的“类型”是否有任何限制?如果是,我如何从文档中识别这些内容? 我知道对他们

  • 所以我被要求写一个程序,列出学生的名字和分数,并计算平均分数。您需要声明两个名为name和marks的数组。假设学生人数为5人。 声明数组名称:(使用二维数组)字符名称[num\u std][name\u len]//名称长度可以为20个字符 声明数组标记:浮点标记[num\u std]; 让我恼火的是,我不知道为什么当我尝试运行调用名称和标记的循环时我会得到一个空。我还想知道以这种方式编码我的二

  • 问题内容: 我想删除使用添加的所有特定类型的事件监听器。我看到的所有资源都在说您需要执行以下操作: 但是我希望能够在不知道当前状态的情况下清除它,如下所示: 问题答案: 如果不拦截呼叫并跟踪侦听器,或者使用不幸的是允许使用此类功能的库,那么这是不可能的。 您可以做的最接近的事情是通过克隆元素来删除所有侦听器,这不会克隆侦听器集合。 注意:这还将删除元素子级上的侦听器。

  • 问题内容: 本质上,我希望更改内容时执行脚本。由于脚本是分开的(Chrome扩展程序和网页脚本中的内容脚本),因此我需要一种方法来简单地观察DOM状态的变化。我可以设置轮询,但这似乎草率。 问题答案: 长期以来,DOM3突变事件是最佳的可用解决方案,但由于性能原因,不建议使用它们。DOM4突变观察者代替了不推荐使用的DOM3突变事件。目前,它们在现代浏览器中的实现方式为(或在旧版Chrome中由供

  • 我目前正在尝试编写一些JavaScript来获取已单击的类的属性。我知道要正确地执行此操作,我应该使用事件监听器。我的代码如下: 我希望每次点击其中一个类时都有一个警告框来告诉我该属性,但不幸的是,这并不起作用。有人能帮忙吗?