従来の 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 コンポーネントにカプセル化します。

推薦する

MySQL 8.0.15 winx64 解凍版のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.15 winx64解凍版のインストールと設定方法を紹介します。具体...

Mysql の使用法の概要

導入EXISTS は、サブクエリが少なくとも 1 行のデータを返すかどうかを確認するために使用されま...

Vue プロジェクトで axios をカプセル化する方法 (http リクエストの統合管理)

1. 要件Vue.js フレームワークを使用してフロントエンド プロジェクトを開発する場合、サーバ...

Mysql 5.6ではユーザー名とパスワードを変更するメソッドが追加されました

まずMySQLにログインする シェル> mysql --user=root mysqlパスワー...

Windows DNS サーバーに「ワームレベル」の脆弱性が露呈、17 年間存在

脆弱性の紹介SigRed の脆弱性はワーム化可能であるため非常に危険です。つまり、ユーザーの介入なし...

ウェブサイトのコンテンツの100~1%はナビゲーションである

ウェブサイトでは、コンテンツの(100-1)%がナビゲーションです1. ジェシー・ジェームズ・ギャレ...

シンプルな広告ウィンドウを実現するjs

この記事では、参考までに、シンプルな広告ウィンドウを実装するためのjsの具体的なコードを紹介します。...

Vue-Jest自動テストの基本構成の詳しい説明

目次インストール構成よくある間違い事前テスト作業依存関係の扱いインスタンスとDOMを生成する要約する...

MySQL SELECT文の実行方法

MySQL Select ステートメントはどのように実行されますか?最近、Geek Time で D...

get メソッドによる HTML フォームの値転送の例

google.htmlインターフェースは図の通りですコードは図のとおりです: (比較的シンプルで、入...

VueのVuexの4つの補助機能について

目次1. 補助機能2. 例1. mapState と mapGetters 2. mapMutati...

コネクタコンポーネントから Tomcat のスレッドモデルを見る - BIO モード (推奨)

Tomcat の上位バージョンでは、デフォルト モードは NIO モードを使用することになります。...

Linux で rpm パッケージを見つけるために CD をマウントする方法

前面に書かれたLinux を使用する際にソフトウェアをインストールする必要がある場合があります。もち...

ubuntu16.04 で nginx を完全にアンインストールするための関連コマンド

nginx の概要nginx は、無料のオープンソースの高性能 HTTP サーバーおよびリバース プ...

2012年のベストWebデザイン作品レビュー[パート1]

新年の初めに、友人の健康と2013年が素晴らしい年となることを心からお祈りいたします。この記事では、...