Spring Boot 中使用 CommondLineRunner時 @Order指定順序不生效的問題處理。

  • 問題:

項目中使用CommondLineRunner 在Spring 初始化完成後執行特定任務,通過@Order指定多個任務的執行順序不生效。

  • 結論:

@Order的用法錯誤導致spring 無法正確讀取順序。

正確用法:@Order 應當定義在Class上。

錯誤用法:在@Bean標註的方法上添加@Order

  • 過程

CommandLineRunner 最終是通過 org.springframework.boot.SpringApplication類的callRunners方法執行。

通過調用AnnotationAwareOrderComparator的sort對多個CommandLineRunner 進行排序。

通過調試可以知道,runners裏面的每一個runner爲@Bean方法標註的Method返回的對象。

從findOrder的邏輯可以看出在尋找Order值的時候是會從目標Object的Class上去獲取Order信息。

所以直接標註在方法上的@Order纔會不生效。

  • 有些東西還是想當然了。開始的時候還以爲@Order會自己被Spring通過代理的方式注入到@Bean標註的Method返回的實例裏面,然後findOrder的時候會自己去實例裏面找。結果,是自己想多了。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章