자꾸 헷갈려서 정리
어플리케이션 시작 시 호출되는 순서
1. ApplicationStartingEvent
2. ApplicationEnvironmentPreparedEvent
3. ApplicationContextInitializedEvent
4. ApplicationPreparedEvent
5. ContextRefreshedEvent
6. ApplicationStartedEvent
7. ApplicationReadyEvent
여기서, 1-3 번 까지는 ApplicationContext 초기화 전에 시작된다. 때문에, 이 이벤트들은 @EventListener 를 통한 이벤트 등록으로 처리할 수 없다. 왜냐하면 @EventListener 는 해당 리스너 메서드를 가진 클래스가 스프링 빈으로 먼저 스캔되어야 작동하는데, 1-3번 이벤트들은 ApplicationContext 시작 전이기 때문에 이벤트 등록보다 실제 이벤트가 더 먼저 발생한다.
때문에 1-3 번 이벤트들이 작동하기 위해서는 아래와 같이 스프링 어플리케이션 시작 전에 리스너를 선등록해야 한다.
class MyApplicationStartingEventListener : ApplicationListener<ApplicationStaringEvent> {
override fun onApplicationEvent(event: ApplicationStartingEvent) {
...
}
}
...
fun main(args: Array<String>) {
SpringApplicationBuilder(MyApplication::class.java)
.listeners(
MyApplicationStartingEventListener(),
MyApplicationContextInitializedEventListener(),
MyApplicationEnvironmentPreparedEventListener(),
MyApplicationPreparedEventListener(),
)
.run(*args)
}
또, 이벤트는 등록한 순서대로 호출된다. 위의 방법으로 등록되는 이벤트는 ApplicationContext 초기화 시 스캐닝에 의해 등록된 이벤트보다 먼저 등록되기 때문에, 동일한 이벤트가 호출될 때, @EventListener 리스너보다 무조건 먼저 호출된다.
'Java > Spring Boot' 카테고리의 다른 글
test] 어노테이션 정리 (1) | 2022.08.03 |
---|---|
MVC] Serving Static Resources (0) | 2020.08.15 |
JDK 7 에서 Spring JUnit 5 을 사용한 Gradle test (0) | 2020.04.14 |
Issue with Thymeleaf strict HTML parsing (0) | 2020.04.07 |
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test (0) | 2019.02.16 |