gpt4 book ai didi

java - 是否可以让 Spring ApplicationListener 监听 2 种或更多类型的事件?

转载 作者:IT老高 更新时间:2023-10-28 13:47:10 26 4
gpt4 key购买 nike

我有 2 种不同类型的事件,我希望我的类(class)能够相应地(并且以不同方式)监听和处理它们。

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

这给了我一个错误,您不能使用不同的参数两次实现相同的接口(interface)。

没有实现 ApplicationEvent 的监听器(或 Foo 和 Bar 将实现的其他一些通用接口(interface))并使用 instanceof要确定要走的路,我还有其他选择吗?

谢谢!

最佳答案

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

Spring <4.2

不是真的。

您可以为参数使用一个通用的父类(super class)(例如 ApplicationEvent)或 Foo 和 Bar 实现的通用接口(interface),然后您必须自己调整它。

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 bean!


当然,您可以自己实现这些功能。你至少有两种不同的选择,基于 spring 事件调度器框架或者完全分离。对于第二个选择,请务必查看 CDI-Event Mechanim,并可能会搜索一些 Spring 端口。

几年前(我猜是在 2007/2008 年)我自己实现了第一个选择。我有一个监听所有事件的事件调度程序。它是通过 XML 文件配置的。此 xml 文件包含“引用”!对于应该分派(dispatch)的每个事件,bean 中的方法 - 此方法将通过反射调用。因此,可以拥有强类型的事件处理程序方法(这是该方法的目的),但也可以在一个类中拥有多个处理程序方法。现在我会跳过 xml 文件并使用注释和 Bean-Post-Processor


Spring 4.2 更新

Spring 4.2 will have an improved event listener配置(基于注解),可以在一个 bean 中拥有两种不同的事件监听器方法。

@Component
public class ListenerClass {

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

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

}

关于java - 是否可以让 Spring ApplicationListener 监听 2 种或更多类型的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8836073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com