- 問題:
項目中使用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的時候會自己去實例裏面找。結果,是自己想多了。。