-
ApplicationEventPublisherSPRING/스프링프레임워크 핵심개념 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