検索
ホームページJava&#&チュートリアルSpringboot アプリケーション サービスの起動イベントの監視を実装する方法

    1. はじめに

    Spring Boot には、CommandLineRunner と ApplicationRunner という 2 つのインターフェイスがあり、アプリケーションの起動時に特別な処理を行うために使用されます。 SpringApplication で使用されます run() メソッドは、実行が完了する前に実行されます。前の章で紹介した Spring の ApplicationListener インターフェースのカスタム リスナーとサーブレットの ServletContextListener リスナーと比較します。 両方を使用する利点は、アプリケーションの起動パラメータを簡単に使用でき、さまざまなパラメータに応じてさまざまな初期化操作を実行できることです。

    2. 一般的なシナリオの概要

    CommandLineRunner インターフェイスと ApplicationRunner インターフェイスを実装します。通常、アプリケーションの起動前に次のような特別なコードを実行するために使用されます。

    • システムでよく使用されるデータをメモリにロードします

    • アプリケーションの前回の実行時間ガベージデータのクリーニングを実行しました。

    • システム起動成功後の通知の送信など。

    CommandLineRunner インターフェイスを実装し、アプリケーションの起動時にシステムをロードしました。一般的に使用される構成データを次の図に示します。データベースからデータをメモリにロードします。今後データを使用する場合は、getSysConfigList メソッドを呼び出すだけでよく、毎回データベースにデータをロードする必要はありません。システム リソースを節約し、データの読み込み時間を短縮します。

    Springboot アプリケーション サービスの起動イベントの監視を実装する方法

    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 起動構成に次のパラメータを追加し、アプリケーションを保存して起動します

    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 サイトの他の関連記事を参照してください。

    声明
    この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
    高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?Mar 17, 2025 pm 05:46 PM

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

    適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?Mar 17, 2025 pm 05:45 PM

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

    カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?Mar 17, 2025 pm 05:44 PM

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

    キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?Mar 17, 2025 pm 05:43 PM

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

    Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Mar 17, 2025 pm 05:35 PM

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

    分散コンピューティングにJavaのRMI(リモートメソッドの呼び出し)を使用するにはどうすればよいですか?分散コンピューティングにJavaのRMI(リモートメソッドの呼び出し)を使用するにはどうすればよいですか?Mar 11, 2025 pm 05:53 PM

    この記事では、分散アプリケーションを構築するためのJavaのリモートメソッドの呼び出し(RMI)について説明します。 インターフェイスの定義、実装、レジストリのセットアップ、およびクライアント側の呼び出しを詳述し、ネットワークの問題やセキュリティなどの課題に対処します。

    ネットワーク通信にJavaのソケットAPIを使用するにはどうすればよいですか?ネットワーク通信にJavaのソケットAPIを使用するにはどうすればよいですか?Mar 11, 2025 pm 05:53 PM

    この記事では、ネットワーク通信のためのJavaのソケットAPI、クライアントサーバーのセットアップ、データ処理、リソース管理、エラー処理、セキュリティなどの重要な考慮事項をカバーしています。 また、パフォーマンスの最適化手法も調査します

    Javaでカスタムネットワークプロトコルを作成するにはどうすればよいですか?Javaでカスタムネットワークプロトコルを作成するにはどうすればよいですか?Mar 11, 2025 pm 05:52 PM

    この記事では、カスタムJavaネットワーキングプロトコルの作成を詳述しています。 プロトコルの定義(データ構造、フレーミング、エラー処理、バージョン化)、実装(ソケットを使用)、データシリアル化、およびベストプラクティス(効率、セキュリティ、メンテナ

    See all articles

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

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

    AI Clothes Remover

    AI Clothes Remover

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

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

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

    ホットツール

    mPDF

    mPDF

    mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

    SublimeText3 Linux 新バージョン

    SublimeText3 Linux 新バージョン

    SublimeText3 Linux 最新バージョン

    MantisBT

    MantisBT

    Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    Safe Exam Browser

    Safe Exam Browser

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