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 즉, 이벤트 발생 기능을 가지고 있다.

  • 이벤트를 받아서 처리하는 일은 이벤트 핸들러가 담당한다.

    • 이벤트 핸들러는 빈으로 등록해야 한다.

순서를 보면

  1. AppRunnerpublishEvent가 이벤트를 발생시킨다.

  2. 등록되어 있는 빈 중에서 MyEventHandler가 이벤트를 받는다.

  3. MyEventHandler가 해당 이벤트를 출력한다.

개선된 버전

스프링 4.2 이후부터는 MyEventApplicationEvent를 상속하거나 MyEventHandlerApplicationListener를 상속하는 방법을 쓰지 않아도 된다.

  • 이벤트 핸들러는 상속은 하지 않더라도 꼭 빈으로 등록되어야 한다.

    • 그래야 누가 처리할지 알 수 있기 때문이다.

두 개 이상의 이벤트 처리

  • 기본적으로는 순차적으로 처리가 된다.

  • 순차적이란 말은 뭐가 먼저 실행될지는 모르지만 동시에 하는 게 아니라 하나씩 실행된다는 말이다.

둘 다 main 스레드에서 실행되고 있으며 순서는 랜덤이다.

순서 지정

@Order를 사용한다.

순서를 지정한대로 실행되었다.

비동기 실행

@Async로 비동기를 적용할 수 있다. 순서는 스레드 스케줄링에 따라 다르므로 보장되지 않는다.

각각 별도의 스레드에서 실행되었다.

스프링이 제공하는 기본 이벤트

  • ContextRefreshedEvent

    • ApplicationContext를 초기화 했거나 리프래시 했을 때 발생

  • ContextStartedEvent

    • ApplicationContext를 start()하여 라이프사이클 빈들이 시작 신호를 받은 시점에 발생

  • ContextStoppedEvent

    • ApplicationContext를 stop()하여 라이프사이클 빈들이 정지 신호를 받은 시점에 발생

  • ContextClosedEvent

    • ApplicationContext를 close()하여 싱글톤 빈 소멸되는 시점에 발생

  • RequestHandledEvent

    • HTTP 요청을 처리했을 때 발생

Last updated

Was this helpful?