一、Spring boot運行時,會發送以下事件
1. ApplicationStartingEvent
2. ApplicationEnvironmentPreparedEvent:當Environment已經准備好,在context 創建前
3. ApplicationContextInitializedEvent:在ApplicationContext 創建和ApplicationContextInitializer都被調用后,但是bean definition沒有被加載前
4. ApplicationPreparedEvent:bean definition已經加載,但是沒有refresh
5. ApplicationStartedEvent: context 已經被refresh, 但是application 和command-line 的runner都沒有被調用
6. AvailabilityChangeEvent
7. ApplicationReadyEvent: application 和command-line 的runner都被調用后觸發
8. AvailabilityChangeEvent
9. ApplicationFailedEvent: 啟動失敗觸發
另外,會在ApplicationPreparedEvent之后和ApplicationStartedEvent之前發送
ContextRefreshedEvent
二、項目啟動后需要執行某個操作
1. 實現ApplicationListener<E extends ApplicationEvent>接口
2. ApplicationEvent的子類可以是ApplicationReadyEvent或者ContextRefreshedEvent
3. ApplicationReadyEvent的示例
@Component @Slf4j public class ApplicationInit implements ApplicationListener<ApplicationReadyEvent> { // 項目啟動后預熱JSON @Override public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { UserInfo userInfo = new UserInfo(); userInfo.setId(123L); userInfo.setChannel("hello"); String userJson = JSON.toJSONString(userInfo); JSON.parseObject(userJson, UserInfo.class); } }
三、ContextRefreshedEvent多次執行的問題
1. web應用會出現父子容器,這樣就會觸發兩次
2. 解決方法:ApplicationListener<ContextRefreshedEvent> 應該和 ApplicationContext 一對一
參考:
https://www.jianshu.com/p/4cf382e725b3
https://blog.csdn.net/zollty/article/details/86137380
