天天看點

springboot實作系統啟動任務

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));
    }
}

           

結果:

springboot實作系統啟動任務
  • 預設的參數都問空,怎麼指定參數呢?

    1.在

    idea

    中指定參數:
    springboot實作系統啟動任務
springboot實作系統啟動任務
springboot實作系統啟動任務

2.項目打包之後指定參數:

springboot實作系統啟動任務
springboot實作系統啟動任務
springboot實作系統啟動任務

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));
    }
}

           
springboot實作系統啟動任務
springboot實作系統啟動任務
  • 總結:

    ApplicationRunner

    CommandLineRunner

    這兩個實作系統啟動任務都差不多,隻是

    run

    方法的參數不同,以及擷取參數值的方式不同