ApplicationEventPublisher ※주석을 꼭 참고 해 주시기 바랍니다.
이벤트 프로그래밍에 필요한 인터페이스 제공. (옵저버 패턴 구현체)
ApplicationContext extends ApplicationEventPublisher
이벤트 만들기
4.2 스프링 부터 상속받지 않아도 이벤트 사용 가능.
이벤트 방법
- ApplicationEventPublisher.publishEvent();
이번에는 또다른 handler 를 구현 해보고 실행을 하게 되면 어떤것이 먼저 실행 될지는 모르지만 둘 다 실행되는 것을 보시수 있습니다.
추가적으로 각 매소드 handle 안에 System.out.println(Thread.currentThread().toString()); 을 넣고 출력 결과를 보시면 순서는 따로 정하지 않고 랜덤으로 둘중 하나가 먼저 출력되며 같은 스레드에서 발생하는 것을 알 수 있습니다.
이벤트 처리 방법
- ApplicationListener<이벤트> 구현한 클래스 만들어서 빈으로 등록
- 4.2부터 @EventListner 사용해서 빈의 메소드에 사용가능
- 기본적으로 동기화.(Syncronized)
- 순서 정하려면 @Order 사용 -> @Order(Ordered.HIGHEST_PRECEDENC) <괄호 안에 +1 을 더해주면 늦게 실행.>
- 비동기적 실행을 원한다면 @Async 사용 (각 스레드 풀에서 따로 놀고 스케쥴링에 따라 다르기 때문에 order의미가 없음. <이거 하나만 어노테이션한다 해서 (한 스레드에서 동작) asyn처럼 동작하는 것이 아닙니다.> )
- => main 메소드로 가서 @SpringBootApplication 밑에 @EnableAsyn 라고 작성합니다. 그러면 각 서로 다른 스레드에서 실행이 되는 것을 확인 할 수 있습니다.
스프링이 제공하는 기본 이벤트 (ApplicationCotext -> ctx )
- ContextRefreshedEvent : ctx를 초기화 했더니 리프레시 했을 때 발생.
- ContextSharedEvent : ctx를 start() 하여 라이프사이클 빈들이 시작 신호를 받은 시점에 발생.
- ContextStoppedEvet : ctx를 stop() 하여 라이프사이클 빈들이 정지 신호 받은 시점에 발생.
- ContextClosedEvent : ctx를 colse() 하여 싱글톤 빈 소멸되는 시점에 발생.
- RequestHandlerEvent : HTTP 요청을 처리했을 때 발생.
ContextRefreshedEvent 와 ContextClosedEvent 사용은 여러 myhandler 만들고 안에 이렇게 사용 가능합니다.
ApplicationContext applicationContext=event.getApplicationContext();
var applicationContext=event.getApplicationContext();
sout(applicationContext)
각 해당 출력의 결과는 먼저 refresh 가 시작되고 마지막에 closed 가 찍히는 것을 알 수 있습니다.
'Spring > Spring_CoreTechnologies' 카테고리의 다른 글
SpringFrameWork CoreTechnition_section5_12부 (0) | 2020.11.24 |
---|---|
SpringFrameWork CoreTechnition_section4_11부 (0) | 2020.11.20 |
SpringFrameWork CoreTechnition_section1_6부 (0) | 2020.11.19 |
SpringFrameWork CoreTechnition_section1_5부 (0) | 2020.11.18 |
SpringFrameWork CoreTechnition_section1_4부 (0) | 2020.11.17 |
댓글