Spring項目啟動后執行操作:ContextRefreshedEvent和ApplicationReadyEvent


一、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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM