public class MyEvent extends ApplicationEvent {
private int data;
private Object source;
public MyEvent(Object source) {
super(source);
}
public MyEvent(Object source, int data) {
super(source);
this.data = data;
this.source = source;
}
public Object getSource() {
return source;
}
public int getData() {
return data;
}
}
ApplicationEvent
클래스를 상속받지 않아도 사용 가능@Autowired
ApplicationEventPublisher publishEvent;
publishEvent.publishEvent(new MyEvent(this, 100));
@Component
public class MyEventHandler implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
System.out.println("이벤트 받았다. 데이터는 " + event.getData());
}
}
// or
@Component
public class MyEventHandler {
@EventListener
public void handle(MyEvent event) {
System.out.println("이벤트 받았다. 데이터는 " + event.getData());
}
}
스프링 4.2 부터 implements
필요없다. 대신 메소드 위에 @EventListener
어노테이션을 추가 한다.
Bean이어야 한다.
기본적으로 synchronized.
같은 이벤트를 처리하는 핸들러가 여러개인 경우 순차적으로 실행된다.
우선순위는 @Order
어노테이션을 사용한다.
@EventListener
@Order(Ordered.HIGHEST_PRECEDENCE) // 최우선
// @Order(Ordered.HIGHEST_PRECEDENCE + 2) // 차우선
public void handle(MyEvent event) { }
비동기적으로 사용하고 싶으면 @Async
와 함께 사용
@Async
어노테이션만 붙인다고 동작하지 않는다. 스레드 관련 설정이 필요하다.@Component
public class MyEventHandler {
// ApplicationContext를 초기화 했거나 리프레시 했을때 발생
@EventListener
public void handle(ContextRefreshedEvent event) {
System.out.println("ContextRefreshedEvent");
}
// ApplicationContext를 close() 하여 싱글톤 빈 소멸되는 시점에 발생
@EventListener
public void handle(ContextClosedEvent event) {
System.out.println("ContextClosedEvent");
}
}