springboot實作系統啟動任務
1.什麼是系統啟動任務
系統啟動任務就是當項目啟動的時候能夠執行的東西就是系統啟動任務,即随着項目啟動而執行的。如果是
ssm
項目一般可以通過自定義
listener
監聽器實作,監聽
servletContext
的啟動然後做一些初始化的操作;
springboot
中也可以這麼做,但是也有自己的方案即
CommandLineRunner
和
ApplicationRunner
來實作。
2.CommandLineRunner實作系統啟動任務
首先自定一個類實作
CommandLineRunner
接口,然後重寫裡面的
run
方法,這個
run
方法裡面的參數就是啟動類
main
方法上的參數,預設是為空的。
下面
demo
中有兩個類都是實作了
CommandLineRunner
接口,存在多個系統啟動任務時就有一個優先級的問題,可以使用
@Order
注解指定優先級,數字越小優先級越大。
package com.cls.commandlinerunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Arrays;
/**
* @author by CLS
* @Classname MyCommandLineRunner
* @Description TODO
* @Date 2021/5/15/0015 9:06:46
*/
@Component
@Order(100)
public class MyCommandLineRunner implements CommandLineRunner {
/**
* 當系統啟動時,run方法會被觸發,方法參數就是main方法所傳入的參數
* 如果存在多個系統啟動任務的話,必然存在一個優先級的問題,可以使用@Order注解
* 指定優先級,數字越小優先級越大
* @param args 這個參數就是系統啟動類上的args
* @throws Exception
*/
@Override
public void run(String... args) throws Exception {
//預設列印出來是空的
System.out.println("args = " + Arrays.toString(args));
}
}
package com.cls.commandlinerunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Arrays;
/**
* @author by CLS
* @Classname MyCommandLineRunner
* @Description TODO
* @Date 2021/5/15/0015 9:06:46
*/
@Component
@Order(90)
public class MyCommandLineRunner2 implements CommandLineRunner {
/**
* 當系統啟動時,run方法會被觸發,方法參數就是main方法所傳入的參數
* @param args 這個參數就是系統啟動類上的args
* @throws Exception
*/
@Override
public void run(String... args) throws Exception {
System.out.println("args2 = " + Arrays.toString(args));
}
}
結果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSPNpnW1Z0Vk5GbHFme5cVWwh2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3kjMwQjN1YTM1ETNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
-
預設的參數都問空,怎麼指定參數呢?
1.在
中指定參數:idea
springboot實作系統啟動任務
2.項目打包之後指定參數:
3.ApplicationRunner實作系統啟動任務
package com.cls.commandlinerunner;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
/**
* @author by CLS
* @Classname MyApplicationRunner
* @Description TODO
* @Date 2021/5/15/0015 9:30:07
*/
@Component
@Order(70)
public class MyApplicationRunner2 implements ApplicationRunner {
/**
*
* @param args
* @throws Exception
*/
@Override
public void run(ApplicationArguments args) throws Exception {
//擷取沒有鍵的參數,擷取到的值和 commandlinerunner 一緻
List<String> nonOptionArgs = args.getNonOptionArgs();
System.out.println("nonOptionArgs2 = " + nonOptionArgs);
//擷取所有的鍵
Set<String> optionNames = args.getOptionNames();
System.out.println("optionNames = " + optionNames);
for (String optionName : optionNames) {
System.out.println("optionName2: " + optionName +"---"+ args.getOptionValues(optionName));
}
//擷取指令行中的所有參數,不管有沒有鍵的
String[] sourceArgs = args.getSourceArgs();
System.out.println("sourceArgs2 = " + Arrays.toString(sourceArgs));
}
}
- 總結:
和ApplicationRunner
這兩個實作系統啟動任務都差不多,隻是CommandLineRunner
方法的參數不同,以及擷取參數值的方式不同run