-
IoC 컨테이너와 빈(5) - ApplicationEventPublisher카테고리 없음 2020. 3. 19. 00:10반응형
@Controller public class HomeController { @Autowired private ApplicationEventPublisher publishEvent; @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) throws Exception{ // 발생되어있는 이벤트를 등록되어있는 빈중에서 데이터를 출력 publishEvent.publishEvent(new MyEvent(this, 100)); return "home"; } }
public class MyEvent { private int data; private Object source; public MyEvent(Object source, int data) { this.source = source; this.data = data; } public Object getSource() { return source; } public int getData() { return data; } }
@Component public class MyEventHandler { @EventListener public void handler(MyEvent event) { System.out.println("이벤트 받았다. 데이터는 " + event.getData()); } }
MyEvent Class는 스프링 프레임워크에 종속되어있지 않다. -> POJO
특이사항
- ApplicationEvent 상송 스프링 4.2 부터는 이 클래스를 상속받지 않아도 이벤트로 사용할 수 있다.
이벤트 발생 시키는 방법
- ApplicationEventPublisher.publishEvent();
이벤트 처리하는 방법
@Component public class MyEventHandler { @EventListener @Async public void handler(MyEvent event) { System.out.println(Thread.currentThread().toString()); System.out.println("이벤트 받았다. 데이터는 " + event.getData()); } @EventListener @Async public void handler2(MyEvent event) { System.out.println(Thread.currentThread().toString()); System.out.println("이벤트 받았다. 데이터는 " + event.getData()); } @EventListener @Async public void handler3(MyEvent event) { System.out.println(Thread.currentThread().toString()); System.out.println("이벤트 받았다. 데이터는 " + event.getData()); } } @Component public class AnotherHandler { @EventListener @Order(Ordered.HIGHEST_PRECEDENCE) public void handler(MyEvent event) { System.out.println(Thread.currentThread().toString()); System.out.println("Another " + event.getData()); } @EventListener @Order(Ordered.HIGHEST_PRECEDENCE + 48) public void handler2(MyEvent event) { System.out.println(Thread.currentThread().toString()); System.out.println("Another " + event.getData()); } }
- ApplicationListener<이벤트> 구현한 클래스 만들어서 빈으로 등록하기.
- 스프링 4.2 부터는 @EventListener를 사용해서 빈의 메소드에 사용할 수 있다.
- 기본적으로는 synchronized.
- 순서를 정하고 싶다면 @Order와 함께 사용.
- 뒤에 + 를 붙이게 된다면 나중에 실행
- 비동기적으로 실행하고 싶다면 @Async와 함께 사용.
스프링이 제공하는 기본 이벤트
- ContextRefreshedEvent: ApplicationContext를 초기화 했더나 리프래시 했을 때 발생.
- ContextStartedEvent: ApplicationContext를 start()하여 라이프사이클 빈들이 시작 신호를 받은 시점에 발생.
- ContextStoppedEvent: ApplicationContext를 stop()하여 라이프사이클 빈들이 정지 신호를 받은 시점에 발생.
- ContextClosedEvent: ApplicationContext를 close()하여 싱글톤 빈 소멸되는 시점에 발생.
- RequestHandledEvent: HTTP 요청을 처리했을 때 발생.
반응형