스프링 4.2이전 버전에는 ApplicationEvent 클래스를 상속받아서 이벤트 객체를 만들어야 했음
이벤트 객체 안에 이벤트 발생시에 전달한 데이터같은걸 끼워 넣어서 보낼 수 있슴..
//스프링 4.2 이전에는 ApplicationEvent 클래스를 상속 받아야 했음
public class MyEvent extends ApplicationEvent {
private int data;
public int getData() {
return data;
}
public MyEvent(Object source) {
super(source);
}
public MyEvent(Object source, int data) {
super(source);
this.data = data;
}
}
하지만 현재는,,,
//스프링 4.2이후ApplicationEvent 클래스를 상속 받지 않아도 됨
public class MyEvent {
private int data;
private Object source;
public int getData() {
return data;
}
public int getSource() {
return source;
}
public MyEvent(Object source, int data) {
this.source = source;
this.data = data;
}
}
반드시 이벤트 핸들러는 빈으로 등록이 되어야 한다.
그리고, 이벤트 핸들러 역시 스프링 4.2이전에는 ApplicationListener <E> 클래스를 상속받야 했다.
onApplicationEvent 메서드에 이벤트 객체를 파라미터로 받고 오버라이드 해서 이벤트 발생시 할 동작을 메서드로 정의함!
//event handler는 빈으로 등록해 주어야 한다
//스프링 4.2 이전에는 ApplicationListener<E> 인터페이스를 상속하야함
@Component
public class MyEventHandler implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent myEvent) {
System.out.println("이벤트 받았음"+myEvent.getData());
}
}
하지만 지금은,,,
이벤트 발생시 처리하고 싶은 동작을 메서드에 정의하고 해당 메서드에 @EventHandler 어노테이션만 붙여주면 끝~ (빈으로는 등록해야함)
@Component
public class MyEventHandler {
@EventListener
@Async //비동기적으로 실행하고싶다면 @Async 어노테이션을 붙여주면 됨 단, applicaitonRunner에 @EnableAsync도 붙여줘야 멀티스레드 환경에서 돌아감
@Order(Ordered.HIGHEST_PRECEDENCE) //하나의 이벤트를 처리하는 핸들러가 두개이상일경우 이렇게 순서를 정할 수 있다 (낮을수록 우선순위 숫자로도 줄수 있음)
public void eventHandleMethod(MyEvent myEvent) {
System.out.println("이벤트 받았음"+myEvent.getData());
}
}
@SpringBootApplication
@PropertySource("classpath:/app.properties")
@EnableAsync
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext applicationContext;
@Autowired
ApplicationEventPublisher applicationEventPublisher;
@Override
public void run(ApplicationArguments args) throws Exception {
applicationEventPublisher.publishEvent(new MyEvent(this, 100));
}
}
스프링에서는 ApplicationContext에 관련되어 제공하는 기본 이벤트 들이 있는데....
예제를 살펴보자면,,,
//스프링이 제공하는 기본 이벤트1 - ContextRefreshedEvent
@EventListener
public void eventHandleMethod(ContextRefreshedEvent event) {
//어플리케이션 컨택스트가 초기화되거나 리프레쉬 될때 발생하는 이벤트
System.out.println(event.getApplicationContext().toString());
}
//스프링이 제공하는 기본 이벤트2 - ContextClosedEvent
@EventListener
public void eventHandleMethod(ContextClosedEvent event) {
//어플리케이션 컨택스트가 closed되어 소멸될때 발생하는 이벤트
System.out.println(event.getApplicationContext().toString());
}
//스프링이 제공하는 기본 이벤트3 - ContextStartedEvent
@EventListener
public void eventHandleMethod(ContextStartedEvent event) {
//어플리케이션 컨택스트를 start()해서 라이프사이클 빈들이 시작 신호를 받으면 발생하는 이벤트
System.out.println(event.getApplicationContext().toString());
}
//스프링이 제공하는 기본 이벤트4 - ContextStoppedEvent
@EventListener
public void eventHandleMethod(ContextStartedEvent event) {
//어플리케이션 컨택스트를 stop()하여 라이프사이클 빈이 정지하면 발생하는 이벤트
System.out.println(event.getApplicationContext().toString());
}
//스프링이 제공하는 기본 이벤트5 - RequestHandledEvent
@EventListener
public void eventHandleMethod(RequestHandledEvent event) {
//HTTP 요청을 처리했을 때 발생하는 이벤트
System.out.println("처리완료");
}