Application의 기능 중에는 ApplicationEventPublisher도 있다.
ApplicationEventPublisher는 이벤트 기반의 프로그래밍을 할 때 유용한 인터페이스이다.
이벤트 기반 프로그래밍이란, Event 객체가 있고, 그 Event 객체를 다루는 EventHandler 객체가 있는 것이다.
Event객체에는 data도 담아서 다룰 수 있다.
이 Event 객체를 다루는 EventHandler 객체는 Bean으로 등록이 되어야하며 ApplicationListner를 implements 하여 onApplicationEvent 메서드를 override하여 다룬다.
ApplicationEventPublisher 객체의 publishEvent 메서드를 통해 실행한다.
메인이 실행되면, eventPublisher.publishEvent(new MyEvent(this, 100)); 가 실행되면서, MyEvent를 발생시키고,
등록되어있는 Bean 중에서 MyEventHandler가 받아서 onApplicationEvent 메서드가 실행되면서 이벤트에 있는 데이터를 가져온다.
*스프링 4.2부터는 POJO구조로, Spring 코드 없이 이벤트 기반의 프로그래밍을 할 수 있다. 이벤트 객체는 ApplicationEvent를 extends 할 필요 없고, 이벤트 핸들러 객체는 ApplicationListener를 implements 할 필요가 없다. 이벤트 핸들러 객체는 대신 @EventListener 어노테이션을 사용한다. 이렇게 하면, 코드에 spring 코드가 들어가지 않게 된다.
만약 같은 이벤트를 다루는 이벤트 핸들러가 여러개인 경우, 순차적으로 진행된다.(A 핸들러가 실행되고, B 핸들러가 실행됨. 반대가 될 수도 있음 뭐가 먼저 실행될지는 모르지만 차례차례 진행)(같은 쓰레드)
핸들러들의 순서가 필요한 경우는 @Order 어노테이션을 사용한다.
비동기인 경우 각각 쓰레드에서 실행되므로, Order가 의미가 없다. 어떤 쓰레드가 먼저 실행될지는 정할 수 없다.
각각 핸들러에 @Async 어노테이션을 붙여주고, 메인에서 @EnableAsync 어노테이션을 붙여주면 된다.