如何使用 CommandLineRunner?

banq發表於2018-08-22
要使用CommandLineRunner,我們建立一個實現CommandLineRunner介面的類,並過載它的run()方法,使用Spring如@Component之類註釋此類,當Spring Boot應用啟動時,就在完成啟動之前,CommandLineRunner將會被執行。我們可以將命令列引數傳遞給 CommandLineRunner,它用於在主入口應用程式啟動之前啟動任何排程程式或記錄任何訊息。

首先,讓我們看看如何在Maven執行我們的應用時傳遞引數,對於Spring Boot 2.x,我們可以使用-Dspring-boot.run.arguments傳遞引數:
mvn spring-boot:run -Dspring-boot.run.arguments=--spring.main.banner-mode=off,--customArgument=custom

如何在使用Gradle Plugin執行應用程式時傳遞引數? 要在build.gradle檔案中配置我們的bootRun任務:

bootRun {
    if (project.hasProperty('args')) {
        args project.args.split(',')
    }
}
<p class="indent">

現在,我們可以傳遞命令列引數,如下所示:
./gradlew bootRun -Pargs=--spring.main.banner-mode=off,--customArgument=custom

除了傳遞自定義引數,我們還可以覆蓋系統屬性。例如,這是我們的application.properties檔案:

server.port=8081
spring.application.name=SampleApp
<p class="indent">

要覆蓋server.port值,我們需要以下面的方式傳遞新值:
mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8085

注意:
1. Spring Boot將命令列引數轉換為屬性,並將它們新增為環境變數;
2. 我們可以在application.properties中使用佔位符,使用簡短的命令列引數-port=8085,而不是多個server的-server.port=8085:

server.port=${port:8080}
<p class="indent">

2. 命令列引數優先於application.properties值

我們可以阻止我們的應用程式將命令列引數轉換為屬性:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        application.setAddCommandLineProperties(false);
        application.run(args);
    }
}
<p class="indent">


如何從應用程式的main()方法訪問命令列引數?

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    public static void main(String[] args) {
        for(String arg:args) {
            System.out.println(arg);
        }
        SpringApplication.run(Application.class, args);
    }
}
<p class="indent">


[該貼被banq於2018-08-22 20:15修改過]

相關文章