ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ApplicationEventPublisher
    SPRING/스프링프레임워크 핵심개념 2021. 5. 16. 23:31

    - ApplicationPublisher는 이벤트 프로그래밍에 필요한 인터페이스를 제공한다.

    - ApplicationContext는 ApplicationEventPublisher를 상속한다.

     

    Event class

    // Spring 4.2 버전 이후 부터는 ApplicationEvent 상속 필요 X
    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;
        }
    
    }
    

     

    Event 발생시키는 법

    - publishEvent 메서드 이용

    @Component
    public class AppRunner implements ApplicationRunner {
    
        @Autowired
        ApplicationEventPublisher applicationEventPublisher;
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            // 이벤트 발생
            applicationEventPublisher.publishEvent(new MyEvent(this,100));
        }
    }
    

     

    Event를 처리하는 EventHandler

    - Spring 4.2 이전 버전

    @Component
    public class MyEventHandler implements ApplicationListener<MyEvent>{
    
        @Override
        public void onApplicationEvent(MyEvent myEvent) {
            System.out.println(Thread.currentThread().toString());
            System.out.println("이벤트 받았다. 데이터는 " + myEvent.getData());
        }
    
    }

     

    - Spring 4.2 이후 버전

    @Component
    public class MyEventHandler
    {
        @EventListener
        @Order(Ordered.HIGHEST_PRECEDENCE )
        public void handle(MyEvent event) {
            System.out.println(Thread.currentThread().toString());
            System.out.println("이벤트 받았다. 데이터는 " + event.getData());
        }
        
        @EventListener
        @Async
        public void handle(ContextRefreshedEvent event) {
            System.out.println(Thread.currentThread().toString());
            System.out.println("ContextRefreshedEvent");
        }
    
        @EventListener
        @Async
        public void handle(ContextClosedEvent event) {
            System.out.println(Thread.currentThread().toString());
            System.out.println("ContextClosedEvent");
        }
    }
    

    - EventHandler가 여러개인 경우에는 @Order를 통해서 EventHandler 간의 우선순위를 지정할 수 있다.

      (숫자가 낮을 수록 먼저)

    - @Async를 이용하여 비동기를 실행할 수 있다.

     비동기의 경우에는 @Order가 의미가 없다. (각각의 쓰레드 풀에서 따로 돌기 때문에)

    @Component
    public class AnotherHandler {
        @EventListener
        @Order(Ordered.HIGHEST_PRECEDENCE +3)
        public void handle(MyEvent event) {
            System.out.println(Thread.currentThread().toString());
            System.out.println("이벤트 받았다.(Another) 데이터는 " + event.getData());
        }
    }
    

     

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

    스프링은 다음과 같은 이벤트를 제공한다.

     

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

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

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

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

    RequestHandledEvent: HTTP 요청을 처리했을 때 발생.

     

     

    'SPRING > 스프링프레임워크 핵심개념' 카테고리의 다른 글

    Resource 추상화  (0) 2021.05.18
    ResourceLoader  (0) 2021.05.17
    MessageSource - 다국어  (0) 2021.05.16
    Environment - 프로퍼티  (0) 2021.05.14
    Environment - 프로파일  (0) 2021.05.14
Designed by Tistory.