在日常的項目開發中經常會遇到這樣的需求:項目啟動的時候進行一些一次性的初始化工作,如讀取加載資源文件、或者執行其它外部程序。
這個時候我們就可以用到spring-boot為我們提供的一種擴展機制--Runner。
在spring-boot中提供了兩種Runner接口:ApplicationRunner和CommandLineRunner,接下來我們就看看他們都是怎么使用的
Runner的使用
要想在我們的項目中使用ApplicaitonRunner和CommandLineRunner只需要實現如下代碼即可:
從代碼中我們可以看出使用上是非常方便的,只需要實現相應的接口類,然后創建bean即可。上面的代碼的輸出結果為:
ApplicaitonRunner和CommandLineRunner相比,它們雖然都只有一個run接口,但是各自接收的參數類型卻不一樣,這也是他們唯一的區別。
- CommandLineRunner的run方法接收的是一個String類型的可變參數,它的值就是我們main函數接收到的命令行參數。
- ApplicaitonRunner的run方法接收一個ApplicationArguments類型的參數,ApplicationArguments會對spring-boot程序的啟動參數進行解析和分類,把[--{operation-name}={operation-value}]解析操作參數,其它情況被分類為非操作參數。
--op1=value1 --op2=value2 arg1 arg2 操作類參數:op1---值為value2,op2---值為value2 非操作參數:arg1,arg2
Runner的實現原理
spring-boot的runner擴展的實現也是非常的簡單的。寫過spring-boot程序的朋友一定對SpringApplication.run方法影響深刻,我們今天講的runner也是在這個方法中被調用的。整個調用過程:
- SpringApplication.run調用callRunners方法
- 查找實現了ApplicationRunner和CommandLineRunner接口的Bean,統一存放在一個list中
- 根據Bean的order進行排序
- 循環調用每一個Runner Bean的run接口。
實現過程的核心代碼: