You're correct, you can also use the ApplicationListener + ApplicationEvent.

But in my opinion EventBus is more flexible.

Suppose you have two events: SelectionEvent and StatusEvent.

Using ApplicationListener:
Code:
public void SomeClass implements ApplicationListener {
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof SelectionEvent) {
            SelectionEvent selectionEvent = (SelectionEvent) event;
            // do something with the event
        }

        if (event instanceof StatusEvent) {
            StatusEvent statusEvent = (StatusEvent) event;
            // do something with the event
        }
    }
}
Using EventBus:
Code:
public void SomeClass {
    public SomeClass() {
        // this could be handled by the Spring App Context
        AnnotationProcessor.process(this);
    }

    @EventSubscriber(eventClass=StatusEvent.class)
    public void statusChanged(StatusEvent event) {
        // do something with the event
    }

    @EventSubscriber(eventClass=SelectionEvent.class)
    public void selectionChanged(SelectionEvent event) {
        // do something with the event
    }
}
So, using EventBus you don't have to cast the event objects, can use any method name you want, and are free to implement your event as you wish (no subclassing, you can in fact use simple POJO's as events).

regards,

Peter