1. はじめに
Spring Boot には、CommandLineRunner と ApplicationRunner という 2 つのインターフェイスがあり、アプリケーションの起動時に特別な処理を行うために使用されます。 SpringApplication で使用されます run() メソッドは、実行が完了する前に実行されます。前の章で紹介した Spring の ApplicationListener インターフェースのカスタム リスナーとサーブレットの ServletContextListener リスナーと比較します。 両方を使用する利点は、アプリケーションの起動パラメータを簡単に使用でき、さまざまなパラメータに応じてさまざまな初期化操作を実行できることです。
2. 一般的なシナリオの概要
CommandLineRunner インターフェイスと ApplicationRunner インターフェイスを実装します。通常、アプリケーションの起動前に次のような特別なコードを実行するために使用されます。
システムでよく使用されるデータをメモリにロードします
アプリケーションの前回の実行時間ガベージデータのクリーニングを実行しました。
システム起動成功後の通知の送信など。
CommandLineRunner インターフェイスを実装し、アプリケーションの起動時にシステムをロードしました。一般的に使用される構成データを次の図に示します。データベースからデータをメモリにロードします。今後データを使用する場合は、getSysConfigList メソッドを呼び出すだけでよく、毎回データベースにデータをロードする必要はありません。システム リソースを節約し、データの読み込み時間を短縮します。
2. @Component 定義を通じて小さなコード実験が実装されます。
CommandLineRunner: パラメーターは文字列配列です。
@Slf4j @Component public class CommandLineStartupRunner implements CommandLineRunner { @Override public void run(String... args){ log.info("CommandLineRunner传入参数:{}", Arrays.toString(args)); } }
ApplicationRunner:パラメータは ApplicationArguments に入れて getOptionNames()、getOptionValues()、getSourceArgs() でパラメータを取得します
@Slf4j @Component public class AppStartupRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) { log.info("ApplicationRunner参数名称: {}", args.getOptionNames()); log.info("ApplicationRunner参数值: {}", args.getOptionValues("age")); log.info("ApplicationRunner参数: {}", Arrays.toString(args.getSourceArgs())); } }
@Bean 定義で実装
このメソッドは実行順序を指定できますので注意してください最初の 2 つの Bean は CommandLineRunner、最後の Bean は ApplicationRunner です。
@Configuration public class BeanRunner { @Bean @Order(1) public CommandLineRunner runner1(){ return new CommandLineRunner() { @Override public void run(String... args){ System.out.println("BeanCommandLineRunner run1()" + Arrays.toString(args)); } }; } @Bean @Order(2) public CommandLineRunner runner2(){ return new CommandLineRunner() { @Override public void run(String... args){ System.out.println("BeanCommandLineRunner run2()" + Arrays.toString(args)); } }; } @Bean @Order(3) public ApplicationRunner runner3(){ return new ApplicationRunner() { @Override public void run(ApplicationArguments args){ System.out.println("BeanApplicationRunner run3()" + Arrays.toString(args.getSourceArgs())); } }; } }
@Order
3 を通じて実行順序を設定できます。テストを実行します
IDEA Springboot 起動構成に次のパラメータを追加し、アプリケーションを保存して起動します
テスト出力結果:
c.z.boot.launch.config.AppStartupRunner : ApplicationRunner パラメータ名: [name, age]
c.z.boot .launch.config.AppStartupRunner : ApplicationRunner パラメーター値: [18]
c.z.boot.launch.config.AppStartupRunner : ApplicationRunner パラメーター: [--name=zimug, --age=18]BeanApplicationRunner run3 ()[-- name=zimug, --age=18]
c.z.b.l.config.CommandLineStartupRunner : CommandLineRunner 受信パラメーター: [--name=zimug, --age=18]
BeanCommandLineRunner run1() [--name =zimug, --age=18]
e=18]
BeanCommandLineRunner run2()[--name=zimug, --age=18]
著者は何度もテストしました テストの結果、この優先順位は常にこのようであることがわかりましたが、これが標準であるかどうかを判断することは現時点では不可能です
ApplicationRunnerの実行CommandLineRunner よりも優先度が高い
#Bean 形式で実行される Runner の優先度は、Component アノテーションよりも低く、Runner インターフェースを実装します。 #Order アノテーションは、同じ CommandLineRunner または ApplicationRunner の実行順序のみを保証できますが、クラス間で順序を保証することはできません
4. 概要
CommandLineRunner と ApplicationRunner の中心的な使用法ApplicationRunner は一貫性があり、アプリケーションの開始前に特別なコードを実行するために使用されます。 ApplicationRunner の実行順序は CommandLineRunner よりも前になります。ApplicationRunner はパラメータをオブジェクトにカプセル化し、パラメータ名やパラメータ値などを取得するためのメソッドを提供するため、操作がより便利になります。
5. 問題の概要
これは、作成者が実際に遭遇した実際の問題であり、CommandLineRunner の複数の実装を定義しました。奇妙な問題が発生します。
CommandLineRunner の複数の実装を定義すると、そのうちの 1 つまたは複数が実行されません。分析: 次のコードは、プロジェクトの開始後に SpringBootApplication が実行するコードで、コード内のトラバーサルを通じて CommandLineRunner または ApplicationRunner が開始されることがわかります。つまり、次の CommandLineRunner は、同期的に実行される前の CommandLineRunner の実行が完了した後にのみ実行されます。 private void callRunners(ApplicationContext context, ApplicationArguments args) {
List<Object> runners = new ArrayList<>();
runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
AnnotationAwareOrderComparator.sort(runners);
for (Object runner : new LinkedHashSet<>(runners)) {
if (runner instanceof ApplicationRunner) {
callRunner((ApplicationRunner) runner, args);
}
if (runner instanceof CommandLineRunner) {
callRunner((CommandLineRunner) runner, args);
}
}
}
したがって、同期ブロッキング API または while(true) ループが CommandLineRunner 実装の run メソッド本体で呼び出された場合、トラバーサル内の CommandLineRunner の後の他の実装は実行されません。
以上がSpringboot アプリケーション サービスの起動イベントの監視を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

WebStorm Mac版
便利なJavaScript開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
