이벤트 정의

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;
	}
}

이벤트 호출

@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());
	}
}

스프링 기본 제공 이벤트 처리

@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");
	}
}