ホームページ  >  記事  >  Java  >  CommandLineRunner と ApplicationRunner の概要

CommandLineRunner と ApplicationRunner の概要

不言
不言転載
2019-03-22 10:09:269776ブラウズ

この記事では、CommandLineRunner と ApplicationRunner について説明します。これには一定の参考価値があります。必要な友人は参照してください。お役に立てば幸いです。

CommandLineRunner と ApplicationRunner は Spring Boot によって提供されるインターフェイスであり、どちらも run() メソッドを持っています。これらを実装するすべての Bean は、Spring Boot サービスの開始後に自動的に呼び出されます。

この機能により、初期化作業を行ったり、テスト コードを作成したりするのに理想的な場所です。

CommandLineRunner

Application を使用して実装する

新しいプロジェクトを作成した後、簡単にするために、Application クラスを直接使用して CommandLineRunner インターフェイスを実装します。このクラスのアノテーション @SpringBootApplication によって自動的に設定されます。

package cn.examplecode.sb2runner;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Sb2runnerApplication implements CommandLineRunner {

    private static Logger logger = LoggerFactory.getLogger(Sb2runnerApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(Sb2runnerApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        logger.info("服务已启动,执行command line runner。");

        for (int i = 0; i <p>次に、サービスを直接開始し、次のようにログを確認して、run() メソッドが正常に実行されていることを確認します。 </p><pre class="brush:php;toolbar:false">Tomcat started on port(s): 8080 (http) with context path ''
Started Sb2runnerApplication in 2.204 seconds (JVM running for 3.161)
服务已启动,执行command line runner。

パラメータの受け渡し

The run( ) メソッドには変数パラメータ引数があり、このパラメータはコマンド ライン パラメータを受け取るために使用されます。テストするパラメータを追加しましょう:

CommandLineRunner と ApplicationRunner の概要

次に、サービスを再起動してログを観察します。パラメーターが正常に受信されたことがわかります。

Tomcat started on port(s): 8080 (http) with context path ''
Started Sb2runnerApplication in 1.888 seconds (JVM running for 2.41)
服务已启动,执行command line runner。
args[0]: --param=sth

コマンド ライン パラメーターの転送

Spring Boot を使用する主な利点は、プロジェクトを次のようにできることであると前に述べました。 jar パッケージに直接パッケージ化され、個別にデプロイする必要はありません。 jar パッケージにパッケージ化した後、jar パッケージを直接実行してサービスを開始できます。このようにして、jar パッケージの実行時にコマンド ライン パラメーターを渡し、CommandLineRunner にパラメーターを受信させることができます。

このシナリオはサーバーで特に一般的です。たとえば、操作を外部に公開せずに実行したい場合は、操作のエントリ ポイントとして CommandLineRunner を使用できます。

デモ用に jar パッケージを作成してみましょう。

  1. ターミナル インターフェイスに入り、パッケージ化を開始します。

CommandLineRunner と ApplicationRunner の概要

  1. パッケージ化が完了したら、jar パッケージを実行します。最初に IDE をインストールします サービスが停止しました。

CommandLineRunner と ApplicationRunner の概要

#ログを見るとパラメータも正常に取得できていることがわかります。パラメーターを渡すことにより、ビジネス ロジックのさまざまなパラメーターに基づいてさまざまな操作を実行できます。

上で述べたのは 1 つの CommandLineRunner だけですが、複数の CommandLineRunner がある場合はどうなるでしょうか?実行順序を制御するにはどうすればよいでしょうか?

次に実行順序を指定する方法を紹介します。

実行順序の指定

Spring Boot には、実行順序の指定に使用できるアノテーション「@Order」が用意されています。たとえば、プロジェクトには 3 つの CommandLineRunner があります。 :

@Component
@Order(1)
public class CommandRunner1 implements CommandLineRunner {

    private static Logger logger = LoggerFactory.getLogger(CommandRunner1.class);

    @Override
    public void run(String... args) throws Exception {
        logger.info("执行第一个command line runner...");
    }

}


@Component
@Order(2)
public class CommandRunner2 implements CommandLineRunner {

    private static Logger logger = LoggerFactory.getLogger(CommandRunner2.class);

    @Override
    public void run(String... args) throws Exception {
        logger.info("执行第二个command line runner...");
    }
    
}

@Component
@Order(3)
public class CommandRunner3 implements CommandLineRunner {

    private static Logger logger = LoggerFactory.getLogger(CommandRunner3.class);

    @Override
    public void run(String... args) throws Exception {
        logger.info("执行第三个command line runner...");
    }
    
}

このクラスに @Order アノテーションを直接追加すると、Spring Boot はアノテーションで指定された順序で小さいものから大きいものまで実行します。とてもシンプルですね。

Tomcat started on port(s): 8080 (http) with context path ''
Started Sb2runnerApplication in 1.764 seconds (JVM running for 2.292)
执行第一个command line runner...
执行第二个command line runner...
执行第三个command line runner...

ApplicationRunner

ApplicationRunner と CommandLineRunner は同じことを行います。その run() メソッドは、サービスの開始後に自動的に呼び出されます。唯一の違いは、ApplicationRunner がコマンド ライン パラメーターをカプセル化することです。を使用すると、コマンド ライン パラメーターとパラメーター値を簡単に取得できます。

@Component
public class ApplicationRunner1 implements ApplicationRunner {

    private static Logger logger = LoggerFactory.getLogger(ApplicationRunner1.class);

    @Override
    public void run(ApplicationArguments args) throws Exception {
        logger.info("执行application runner...");
        logger.info("获取到参数: " + args.getOptionValues("param"));
    }
}

実行結果:

CommandLineRunner と ApplicationRunner の概要

#コマンド ライン パラメータは、run() のパラメータ ApplicationArguments を通じて簡単に取得できることがわかります。メソッド.値.

したがって、プロジェクトでコマンド ライン パラメーターを取得する必要がある場合は、ApplicationRunner を使用することをお勧めします。

概要

CommandLineRunner であっても ApplicationRunner であっても、その目的はサービスの開始後にいくつかの操作を実行することです。コマンドラインパラメータを取得する必要がある場合は、ApplicationRunner を使用することをお勧めします。

別のシナリオは、データベース ユーザー データの変更など、サーバー上で操作を実行する必要があるが、適切な実行エントリが見つからない場合です。この場合、これが理想的な使用シナリオです。

以上がCommandLineRunner と ApplicationRunner の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。