DUICUO

[SpringMVCの詳細な議論] SpringMVCの「伝統的な」起動プロセス

[[319179]]

これを WAR ファイルにパッケージ化し、Tomcat などのサーブレット コンテナーで実行するのが、Spring MVC を起動する従来の方法と考えられています。

Spring Boot を組み込み Web サーバーと共に使用し、それを JAR ファイルにパッケージ化して直接実行することは、Spring MVC を起動する最新の方法と言えます。

従来のスタートアッププロセス

web.xml (構成ファイル) 経由で起動するのは確かに従来の方法ですが、web.xml は現在ほとんど廃止されているため、ここでは考慮しません。

対照的に、数年前からSSM(Spring、SpringMVC、MyBatis)で人気を博している、プログラミング(コード記述)によるスタートアップ方式があります。これは確かに伝統的な手法と言えるでしょう。

前の記事で述べたように、Tomcat の起動と初期化のプロセスは、「ブリッジのような」インターフェースである ServletContainerInitializer (サーブレット コンテナ初期化子) を介して SpringMVC に導入されます。

この「ブリッジ」インターフェースでは、「関心のある」クラスまたはインターフェースを指定できます。SpringMVCはWebApplicationInitializerインターフェースを規定しています。その目的は明確です。この初期化インターフェースを使用して、SpringMVCアプリケーションを起動および初期化することです。

まず、下の図 01 に示すように、この初期化インターフェイスを見てみましょう。

SpringMVCにはonStartupメソッドが1つだけあり、そのパラメータはServletContextのみです。このServletContextはTomcatによって作成され、SpringMVCに提供されます。SpringMVCは起動時にこのonStartupメソッドを呼び出し、このメソッド内で自身の作成と初期化を完了します。また、サーブレットとフィルターをServletContextに登録します。

これらはSpring MVCが実行すべきタスクであり、私たちが実行する必要があるタスクではありません。したがって、Spring MVCはこのインターフェースを既に実装しているはずです。下の図02に示すように、型情報を確認してみましょう。

非常に重要と思われるクラスを発見しました:

抽象アノテーション構成ディスパッチャーサーブレット初期化子

残念ながら、このクラスは抽象クラスであり、直接使用することはできませんが、上記の完全な起動ロジック プロセスがすべて含まれています。

SSM に精通しているか、Spring の公式ドキュメントを読んだことがあるなら、このクラスの使い方はご存知でしょう。はい、このクラスを継承するクラスを定義するだけです。

まず、下の図 03 に示すように、公式ドキュメントの使用方法を見てみましょう。

継承後、ルート コンテナに登録するクラス、サーブレット コンテナに登録するクラス、コア サーブレットのマッピング URL の 3 つの情報を提供する必要があります。

ここで言及されているコンテナは Spring の ApplicationContext コンテナを指し、ルート コンテナと Servlet コンテナは親子関係にあり、Spring MVC ではコア Servlet にマップされる URL は "/" である必要があることに注意してください。

以下は、図 04 に示すように、数年前に私の会社用のフレームワークを構築するために使用したコードの一部です。

これはSpringMVCをプログラムで起動する方法です。ここで定義したクラスは、先ほど述べた「興味深い」クラスです。

このクラスはSpringコンテナに登録する必要はありません(または登録できません)。これは、このクラスが対象クラスだからです。TomcatはJARファイルからこのクラスを見つけ、SpringMVCは定義したクラスを取得します。

一番重要なのは、この時点ではSpringコンテナがまだ存在していなかったことです(笑)。なぜなら、Springコンテナはこのクラス内で作成されたからです。面白いと思いませんか?

このクラスには多くの情報が含まれており、コードを記述することですべてを設定できます。いくつか例を挙げます。

たとえば、以下の図 05 に示すように、コア サーブレットのカスタマイズされた設定は次のとおりです。

たとえば、下の図 06 に示すように、必要なフィルターをいくつか追加できます。

たとえば、下の図 07 に示すように、ファイルのアップロードを構成できます。

もちろん、下の図 08 に示すように、Spring コンテナの初期化プロセスに介入して、特定のプロファイルをアクティブ化するなどの追加操作を実行することもできます。

起動時に行うべきこと

実は、すでにいくつか言及されています。以下は主に以下の内容を含む完全版です。

1. ルート コンテナーを作成します。

2. 次に、ルート コンテナを ServletContext に配置します。

3. 次に、サーブレット コンテナを作成します。

4. 次に、サーブレット コンテナーを使用してコア サーブレットを作成します。

5. 次に、コア サーブレットを ServletContext に登録します。

6. 次に、フィルターをいくつか登録します。

以下では、いくつかの画像を用いてこれらの内容を一つずつ説明します。より詳細な理解が必要な場合は、対応するソースコードを参照してください。

ルート コンテナーが作成され、下の図 09 に示すように、それがアノテーション ベースのコンテナー クラスであることがわかります。

ルート コンテナは ServletContext 内に配置されます。これは、ServletContext がアプリケーションの実行時間全体にわたって存在するため、ルート コンテナはグローバルかつ永続的なエンティティになるからです (下の図 10 を参照)。

サーブレット コンテナが作成され、コンテナ クラスもルート コンテナ クラスと同じようにアノテーション ベースになります (下の図 11 を参照)。

以下の図 12 に示すように、サーブレット コンテナーを使用してコア サーブレットを作成します。

以下の図 13 に示すように、コア サーブレットを ServletContext に登録します。

最後に、下の図 14 に示すように、いくつかのフィルターを登録する必要があります。

アカウント所有者は次のように提案しています: Java 開発を行っており、優れた成果を目指している友人には、これらのことを必ず理解してもらうことをお勧めします。