従来の Tomcat スタートアップ サービスと Springboot スタートアップ組み込み Tomcat サービス (推奨) の違い

従来の Tomcat スタートアップ サービスと Springboot スタートアップ組み込み Tomcat サービス (推奨) の違い

springmvc による Spring の統合

  • Spring 統合 springmvc の web.xml 構成は次のとおりです。Tomcat は起動プロセス中に web.xml の内容をロードします。ContextLoaderListener は、Tomcat で ServletContextListener インターフェイスを実装します。そのため、Tomcat コンテナーの起動プロセス中に、ContextLoaderListener を介して Spring コンテナーが初期化され、classpath:spring/applicationContext-*.xml で指定された Spring 構成ファイルがロードされます。この構成ファイルでは、<context:component-scan base-package="org.com.yp"/> のみを構成しました。これは、Bean 登録のために、@Component @Controller@Service およびその他のアノテーションを含む org.com.yp パッケージの下のクラスをスキャンすることを意味します。
  • Bean の登録は、このクラスの AbstractXmlApplicationContext.loadBeanDefinitions メソッドを通じて Bean 定義をロードすることによって行われます。

Spring にロードされる Bean 定義は、org.springframework.context.ConfigurableApplicationContext#refresh メソッドの ConfigurableListableBeanFactory beanFactory = acquireFreshBeanFactory() メソッドによってロードされます。次に、このメソッドは org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory メソッドを呼び出して、Bean ファクトリを作成し、Bean 定義をロードします。

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         java.sun.com の xmlns ディレクトリに javaee.xml というファイルがあります。
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" バージョン="3.0">
  <display-name>アーキタイプで作成された Web アプリケーション</display-name>
  <リスナー>
    <リスナークラス>org.springframework.web.context.ContextLoaderListener</リスナークラス>
  </リスナー>
  <!-- スプリング コンテナをロードします -->
  <コンテキストパラメータ>
    <param-name>コンテキスト構成の場所</param-name>
    <param-value>クラスパス:spring/applicationContext-*.xml</param-value>
  </コンテキストパラメータ>
​
  <サーブレット>
    <サーブレット名>mvc-ディスパッチャ</サーブレット名>
    <サーブレットクラス>org.springframework.web.servlet.DispatcherServlet</サーブレットクラス>
    <!-- springMVC がロードする必要がある構成ファイルを設定します-->
    <初期化パラメータ>
      <param-name>コンテキスト構成の場所</param-name>
      <param-value>クラスパス:spring/spring-*.xml</param-value>
    </init-param>
  </サーブレット>
​
  <サーブレットマッピング>
    <サーブレット名>mvc-ディスパッチャ</サーブレット名>
    <!-- デフォルトではすべてのリクエストに一致します -->
    <url-パターン>/</url-パターン>
  </サーブレットマッピング>
</ウェブアプリ>

tomcat コンテナが起動し、パスを介してリソースにアクセスすると、初めて org.springframework.web.servlet.HttpServletBean#init メソッドが呼び出され、その後の http リクエストではこのメソッド クラスは使用されなくなります。HttpServletBean は Servlet インターフェースの仕様を実装しているため、ブラウザ リクエストが初期化され、サーブレット インターフェースを介して実行されると、springmvc 構成で定義されたロード クラスが spring コンテナからロードされます。Spring と springmvc は親子コンテナです。以下は HttpServletBean の init メソッドです。

パブリックファイナルボイドinit()はServletExceptionをスローします{
		// 初期パラメータから Bean プロパティを設定します。
		PropertyValues ​​pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
		空の場合(!pvs.isEmpty()){
			試す {
				BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
				リソースローダー resourceLoader = 新しい ServletContextResourceLoader(getServletContext());
				bw.registerCustomEditor(Resource.class、新しいResourceEditor(resourceLoader、getEnvironment()));
				initBeanWrapper(bw);
				bw.setPropertyValues(pvs, true);
			}
			catch (BeansException ex) {
				ロガーがエラーを有効としている場合
					logger.error("サーブレット '" + getServletName() + "'" の Bean プロパティの設定に失敗しました、例);
				}
				投げる例;
			}
		}

        //最後に、org.springframework.context.ConfigurableApplicationContext#refresh コンテナの refresh メソッドが呼び出されます。
        // springmvc コンテナを初期化します initServletBean();
	}
    }

Springbootがコンテナを起動する

  • Springboot を起動する方法は、まず springboot の org.springframework.boot.SpringApplication#run(java.lang.String...) メソッドで Spring コンテキスト環境 (Bean ファクトリを含む) を初期化し、次に Spring コンテナーで ConfigurableApplicationContext#refresh メソッドを呼び出して、org.springframework.boot.SpringApplication#refreshContext メソッドを通じて Bean を初期化します。
  • Springとspringmvcの統合環境では、Bean定義はorg.springframework.context.support.AbstractApplicationContext#obtainFreshBeanFactoryメソッドでロードされますが、springbootでは

org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors メソッドでは、Bean 定義の処理を可能にする BeanDefinitionRegistryPostProcessor インターフェースを実装する ConfigurationClassPostProcessor クラスを通じて Bean 定義がロードされます。

// Spring の BeanDefinitionRegistryPostProcessor は、BeanFactoryPostProcessor のサブインターフェースです。
// BeanFactoryPostProcessor の機能は、Bean 定義情報がロードされたが初期化されていない場合に postProcessBeanFactory() メソッドを実行することです。
// BeanDefinitionRegistryPostProcessor は、BeanFactoryPostProcessor の前に実行されます。実行順序はソース コードで定義されています // org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors() メソッド // BeanFactoryPostProcessor は、Bean ファクトリの Bean プロパティ処理コンテナです。簡単に言えば、Bean ファクトリ内のすべての beandefinition (インスタンス化されていない) データを管理し、プロパティを自由に変更できます。
パブリック void refresh() は BeansException、IllegalStateException をスローします {
        同期 (this.startupShutdownMonitor) {
            リフレッシュを準備します。
            
            // Bean ファクトリを取得してサブクラスに指示し、Bean をキャッシュにロードします。Spring Spring MVC 統合では、ここで Bean を初期化します。ConfigurableListableBeanFactory beanFactory = getFreshBeanFactory();
            
            BeanFactory を準備します。
​
            試す {
                BeanFactory を postProcess します。
​
                // この時点で Springboot コンテナのロードが開始され、次の Bean 名が初期化されます。
                //0 = "org.springframework.context.annotation.internalConfigurationAnnotationProcessor" =》対応する ConfigurationClassPostProcessor クラス //1 = "org.springframework.context.annotation.internalAutowiredAnnotationProcessor" =》AutowiredAnnotationBeanPostProcessor
                //2 = "org.springframework.context.annotation.internalCommonAnnotationProcessor" =》CommonAnnotationBeanPostProcessor
                //3 = "org.springframework.context.event.internalEventListenerProcessor" =》EventListenerMethodProcessor
                //4 = "org.springframework.context.event.internalEventListenerFactory" = "DefaultEventListenerFactory
                // Bean ファクトリのポストプロセッサを呼び出します。Bean 定義 (インスタンス化ではない) をロードし、ConfigurationClassPostProcessor を介してスタートアップ クラスのスキャン パスをロードします // 次に、Bean へのパスをロードします。invokeBeanFactoryPostProcessors(beanFactory);
​
                BeanPostProcessors を登録します (beanFactory);
​
                メッセージソースを初期化します。
​
                アプリケーションイベントマルチキャスターを初期化します。
​
                // このメソッドは Springboot のサブクラスによっても実装されており、このメソッドからトマトも開始されます。
                リフレッシュ();
​
                リスナーを登録します。
​
                // 残りのシングルトン Bean をインスタンス化します。
                beanFactory の初期化を終了します。
​
                // 最後に、コンテナはリフレッシュしてリフレッシュイベントを発行します(Spring Cloudもここから起動されます)
                リフレッシュを終了します。
            }
​
            catch (BeansException ex) {
                ロガーが警告を有効にするかどうか
                    logger.warn("コンテキストの初期化中に例外が発生しました - " +
                            "更新の試行をキャンセルしています: " + ex);
                }
​
                // 未処理のリソースを回避するために、すでに作成されたシングルトンを破棄します。
                Bean を破棄します。
​
                // 「アクティブ」フラグをリセットします。
                リフレッシュをキャンセルします(例);
​
                // 例外を呼び出し元に伝播します。
                投げる例;
            }
​
            ついに {
                // Springのコアにある共通のイントロスペクションキャッシュをリセットします。
                // シングルトン Bean のメタデータは今後必要なくなるかもしれません...
                共通キャッシュをリセットします。
            }
        }
    }

従来のTomcatスタートアップサービスとSpringbootスタートアップ組み込みTomcatサービスの違いに関するこの記事はこれで終わりです。TomcatスタートアップサービスとSpringbootスタートアップ組み込みTomcatサービスの違いの詳細については、123WORDPRESS.COMの以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • SpringBoot組み込みTomcatの起動原理の詳しい説明
  • SpringBoot の組み込み Tomcat 起動をキャンセルし、代わりに外部 Tomcat を使用する方法
  • Springboot に組み込まれた Tomcat と Tomcat の外部独立デプロイメントの違いについて簡単に説明します。
  • Tomcat は、Springboot プロジェクトの WAR パッケージの起動時にエラーを報告します: 子の起動時にエラーが発生しました
  • SpringBootでTomcatプロセスを開始する方法
  • SpringBootアプリケーションに組み込まれたTomcatを起動するプロセスのソースコード分析

<<:  ページスピードの最適化の概要

>>:  CSS に基づいて MaterialUI ボタン​​クリックアニメーションを実装し、それを React コンポーネントにカプセル化します。

推薦する

nginxフロー制御とアクセス制御の実装

nginx トラフィック制御レート制限は非常に便利ですが、Nginx では誤解され、誤って設定される...

親コンテナの CSS 均等分割 (完全三分の一) の実装

親コンテナの幅は固定されています。子要素が親の幅を均等に分割するには、どのような方法がありますか?コ...

Dockerコマンドは一般ユーザーが実行できるように実装されている

dockerをインストールすると、通常はdockerユーザーグループが作成されます。ステップ2: 現...

nginx での listen ディレクティブの例の分析

プロットレビュー前回の記事では、ロケーション命令の解析プロセスを分析しました。この内容を簡単に確認し...

虫眼鏡効果を実現するJavaScript

この記事では、虫眼鏡効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。...

mysql の存在する例と存在しない例の詳細な説明

mysql の存在する例と存在しない例の詳細な説明テーブルA |列1 | 列1 | 列3 |テーブル...

Centos7.5でのIPアドレス設定の実装

1. IPアドレスを設定する前に、まずifconfigを使用してネットワークカード情報を表示し、ネッ...

JavaScript のよりエレガントなエラー処理方法 async await

目次背景なぜエラー処理が必要なのでしょうか? async await より適切なエラー処理まとめ要約...

静的リソースファイルのアクセスログをフィルタリングするNginxの実装

乱雑なログ日常的に使用される Nginx は、静的リソース サーバーとリバース プロキシ サーバーの...

CentOS 7 で grub パスワードと単一ユーザー ログインを設定するサンプル コード

Centos7 と Centos6 では、GRUB パスワードの設定手順に大きな違いがあります。これ...

JavaScript を使用してページに動的な検証コードを実装する例

導入:現在、プログラム攻撃を防ぐために、ユーザーがログインまたは登録するときに多くの動的検証テクノロ...

Vue+Websocketはチャット機能を実装するだけです

この記事では、チャット機能を簡単に実装するためのVue+Websocketの具体的なコードを参考まで...

MySQL監視ツールmysql-monitorの詳細な説明

1. 概要mysql-monitor MYSQL 監視ツール、最適化ツール、1 つの Java Sp...

JavaScript でプロパティハイジャックを実装する方法 defineProperty

目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...