SpringBootアプリケーションのmainメソッドに追加のコードを書き込むのではなく、CommandLineRunnerを使用することをお勧めします。SpringBoot CommandLineRunner
CommandLineRunnerは、メインが完了する前に実行されることを理解します。
SpringBootアプリケーションのmainメソッドに追加のコードを書き込むのではなく、CommandLineRunnerを使用することをお勧めします。SpringBoot CommandLineRunner
CommandLineRunnerは、メインが完了する前に実行されることを理解します。
コードをデカップリングするために使用しました。 CommandLineRunnerを使用すると、コードをメインメソッドに配置する代わりに、コードベースの周りに均等に分散させることができます。あなたが渡しているフラグの種類と、なぜそれらを渡す必要があるのかによって、Springはかなりの柔軟性を提供します。
フルコマンドラインツールの場合、初期とコアの動作の間でコードを分割することで、初期化をデカップリングし、少し設定することができます。
スプリングブートサーバーは、コマンドラインから渡されたargsに基づいて構成を上書きできます。
アプリケーションを起動した後にコードを書くだけの理由がありません。
唯一のことは、SpringApplicationRunListener
の前にコマンドラインランナーが呼び出され、#finished
が呼び出されていることです。
私は、人々が主なアプリケーションロジックを実行するためにそれらを使用するのを見ましたが、これは反パターンであると私は考えます。
そうすることに関する厄介なことの1つは、アプリケーション開始タイマーがまだ実行されていることです。タスクが完了すると、Started DemoApplication in 5.626 seconds (JVM running for 0.968)
のようなログエントリが表示されます。
実際には終了したばかりで、アプリケーションに関するメッセージが表示されるのは紛らわしいものです。
最初にコントローラのエンドポイントからメソッドがヒットする前に、キャッシュからロードされた特定のデータを保持しなければならないシナリオが発生しました。このシナリオでは、CommandLineRunnerクラスを拡張した後にrunメソッドを使用してキャッシュを生成する方法を使用することが望ましいため、アプリケーションが起動する前にデータがキャッシュ内ですでに使用可能になっています。
単純なケースでは、違いはありません。
しかし、コードがiocやインタフェースリポジトリ/サービスだけで提供される機能にアクセスする必要がある場合は、完全なアプリケーションの起動を待つ必要があります。そして、完了後のオーバーライドされた実行メソッドの呼び出しは保証されています。
また、CommandLineRunnerは、他の利点があります: