请参阅此答案结尾的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中具有两个不同的事件侦听器方法成为可能。
@Componentpublic class ListenerClass { @EventListener public void handleFooEvent(Foo fooEvent) {...} @EventListener public void handleBarEvent(Bar barEvent) {...}}


