ApplicationEventPublisher
애플리케이션 컨텍스트가 상속받고 있는 인터페이스.
이벤트 프로그래밍에 필요한 인터페이스를 제공하며 옵저버 패턴 구현체다.
ApplicationEvent를 상속하는 방법
// 이벤트는 빈으로 등록되지 않는다. 원하는 데이터를 전달하는 역할이다.
public class MyEvent extends ApplicationEvent {
private int data;
public MyEvent(Object source) {
super(source);
}
public MyEvent(Object source, int data) {
super(source);
this.data = data;
}
public int getData() {
return data;
}
}이벤트를 정의한다.
애플리케이션 컨텍스트는 publish 즉, 이벤트 발생 기능을 가지고 있다.
이벤트를 받아서 처리하는 일은 이벤트 핸들러가 담당한다.
이벤트 핸들러는 빈으로 등록해야 한다.
순서를 보면
AppRunner의publishEvent가 이벤트를 발생시킨다.등록되어 있는 빈 중에서
MyEventHandler가 이벤트를 받는다.MyEventHandler가 해당 이벤트를 출력한다.
개선된 버전
스프링 4.2 이후부터는 MyEvent가 ApplicationEvent를 상속하거나 MyEventHandler가 ApplicationListener를 상속하는 방법을 쓰지 않아도 된다.
이벤트 핸들러는 상속은 하지 않더라도 꼭 빈으로 등록되어야 한다.
그래야 누가 처리할지 알 수 있기 때문이다.
두 개 이상의 이벤트 처리
기본적으로는 순차적으로 처리가 된다.
순차적이란 말은 뭐가 먼저 실행될지는 모르지만 동시에 하는 게 아니라 하나씩 실행된다는 말이다.
둘 다 main 스레드에서 실행되고 있으며 순서는 랜덤이다.
순서 지정
@Order를 사용한다.
순서를 지정한대로 실행되었다.
비동기 실행
@Async로 비동기를 적용할 수 있다. 순서는 스레드 스케줄링에 따라 다르므로 보장되지 않는다.
각각 별도의 스레드에서 실행되었다.
스프링이 제공하는 기본 이벤트
ContextRefreshedEvent
ApplicationContext를 초기화 했거나 리프래시 했을 때 발생
ContextStartedEvent
ApplicationContext를 start()하여 라이프사이클 빈들이 시작 신호를 받은 시점에 발생
ContextStoppedEvent
ApplicationContext를 stop()하여 라이프사이클 빈들이 정지 신호를 받은 시점에 발생
ContextClosedEvent
ApplicationContext를 close()하여 싱글톤 빈 소멸되는 시점에 발생
RequestHandledEvent
HTTP 요청을 처리했을 때 발생
Last updated
Was this helpful?