天天看點

Spring Boot 配置系統啟動任務

學習如何在 Spring Boot 中配置系統啟動任務。

先來回顧下在普通的 web 項目中如何在項目啟動的時做一些初始化操作,一般會自己定義一個 Listener 實作 ServletContextListener 接口,這樣就能監聽到項目的啟動和銷毀,并做相應的資料初始化和銷毀操作,如下:

public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 在這裡做資料初始化操作
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 在這裡做資料備份操作
    }
}
           

在 Spring Boot 中,對系統啟動任務有 2 種解決方案,分别是 CommandLineRunner 和 ApplicationRunner 。

1 CommandLineRunner

建立 MyCommandLineRunner1 和 MyCommandLineRunner2 配置類,分别如下:

@Component
// 數字越小,優先級越大,預設情況下,優先級的值為 Integer.MAX_VALUE,表示優先級最低
@Order(99)
public class MyCommandLineRunner1 implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("MyCommandLineRunner1>>>"+Arrays.toString(args));
    }
}
           
@Component
// 數字越小,優先級越大,預設情況下,優先級的值為 Integer.MAX_VALUE,表示優先級最低
@Order(100)
public class MyCommandLineRunner2 implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("MyCommandLineRunner2>>>"+Arrays.toString(args));
    }
}
           

上述配置類中的參數傳遞有 2 種方式,無需指定 key ,直接寫 value :

  1. 通過 IDEA 配置,如下:
Spring Boot 配置系統啟動任務
  1. 項目打包後通過指令行,如下:

    java -jar spring-boot-commandlinerunner-0.0.1-SNAPSHOT.jar 三國演義 西遊記

2 ApplicationRunner

ApplicationRunner 與 CommandLineRunner 類似,差別是它支援更多形式的參數,如 key/value 。

建立 MyApplicationRunner1 和 MyApplicationRunner2 配置類,分别如下:

@Component
// 數字越小,優先級越大,預設情況下,優先級的值為 Integer.MAX_VALUE,表示優先級最低
@Order(99)
public class MyApplicationRunner1 implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 擷取指令行中的所有參數
        String[] sourceArgs = args.getSourceArgs();
        System.out.println("sourceArgs:" + Arrays.toString(sourceArgs));

        // 擷取指令行中的無 key 參數(和 CommandLineRunner 一樣)
        List<String> nonOptionArgs = args.getNonOptionArgs();
        System.out.println("nonOptionArgs:" + nonOptionArgs);

        // 擷取所有 key/value 形式的參數的 key
        Set<String> optionNames = args.getOptionNames();
        System.out.println("optionNames/optionValues>>>:");
        for (String optionName : optionNames) {
            // 根據 key 擷取 key/value 形式的參數的 value
            System.out.println(optionName + ":" + args.getOptionValues(optionName));
        }

        System.out.println(">>>>>>>>>>>>>>> MyApplicationRunner1結束 >>>>>>>>>>>>>>>>");
    }
}
           
@Component
// 數字越小,優先級越大,預設情況下,優先級的值為 Integer.MAX_VALUE,表示優先級最低
@Order(100)
public class MyApplicationRunner2 implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 擷取指令行中的所有參數
        String[] sourceArgs = args.getSourceArgs();
        System.out.println("sourceArgs:" + Arrays.toString(sourceArgs));

        // 擷取指令行中的無key參數(和 CommandLineRunne r一樣)
        List<String> nonOptionArgs = args.getNonOptionArgs();
        System.out.println("nonOptionArgs:" + nonOptionArgs);

        // 擷取所有 key/value 形式的參數的 key
        Set<String> optionNames = args.getOptionNames();
        System.out.println("optionNames/optionValues>>>:");
        for (String optionName : optionNames) {
            // 根據 key 擷取 key/value 形式的參數的 value
            System.out.println(optionName + ":" + args.getOptionValues(optionName));
        }

        System.out.println(">>>>>>>>>>>>>>> MyApplicationRunner2結束 >>>>>>>>>>>>>>>>");
    }
}
           

ApplicationArguments 類型的參數說明:

  1. args.getSourceArgs():用來擷取指令行中的所有參數。
  2. args.getNonOptionArgs():用來擷取指令行中的無 key 參數(和 CommandLineRunner 一樣)。
  3. args.getOptionNames():用來擷取所有 key/value 形式的參數的 key 。
  4. args.getOptionValues(key)):根據 key 擷取 key/value 形式的參數的 value 。

上述配置類中的參數傳遞有 2 種方式:

  1. 通過 IDEA 配置,如下:
Spring Boot 配置系統啟動任務
  1. 項目打包後通過指令行,如下:

    java -jar spring-boot-applicationrunner-0.0.1-SNAPSHOT.jar 三國演義 西遊記 --age=99

  • Spring Boot 教程合集(微信左下方閱讀全文可直達)。
  • Spring Boot 教程合集示例代碼:https://github.com/cxy35/spring-boot-samples
  • 本文示例代碼:https://github.com/cxy35/spring-boot-samples/tree/master/spring-boot-web/spring-boot-runner

掃碼關注微信公衆号 程式員35 ,擷取最新技術幹貨,暢聊 #程式員的35,35的程式員# 。獨立站點:https://cxy35.com

Spring Boot 配置系統啟動任務

繼續閱讀