См. Обновление Spring 4.2 в конце этого ответа!
Пружина <4.2 </strong>
Не совсем.
Вы можете использовать общий суперкласс для аргумента (например, 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 и, возможно, найдите некоторые пружинные порты.
Я реализовал первый выбор несколько лет назад (наверное, в 2007/2008). Я возглавляю диспетчер событий, который посещает все события. Он был настроен через XML-файл. Этот XML-файл содержит «ссылки»! для методов в bean-компонентах для каждого события, которое должно быть отправлено - эти методы будут вызываться отражением. Таким образом, было возможно иметь строго типизированные методы-обработчики событий (что и было целью этого подхода), а также иметь несколько методов-обработчиков в одном классе. В настоящее время я бы пропустил XML-файл и использовал бы аннотации и постпроцессор Bean
Spring 4.2 update
Spring 4.2 будет иметь улучшенную конфигурацию прослушивателя событий (основанную на аннотациях), которая позволяет иметь два разных метода прослушивателя событий в одном компоненте.
@Component
public class ListenerClass {
@EventListener
public void handleFooEvent(Foo fooEvent) {...}
@EventListener
public void handleBarEvent(Bar barEvent) {...}
}