17

私は春が初めてで、単純な Web アプリケーションを作成しています。Spring MVC のコンテキストについて読んでいます。

私はEclipse用のSTSプラグインを使用しています。プラグインを使用して Spring MVC プロジェクトを作成しました。

プロジェクトには、web.xml、root-context.xml、および servlet-context.xml という 3 つの xml ドキュメントがあります。これらは STS によって作成されました。

  1. web.xml では、ディスパッチャ サーブレットは servlet-context.xml を指しています。ディスパッチャ サーブレットの仕事は、ビューを解決する方法を知っていて、コントローラ Bean が存在する場所である Web アプリケーション コンテキストを作成することだと理解しています。私の理解は正しいですか?もしそうなら、このコンテキストによって達成される他の仕事は何ですか?

  2. 現在、プロジェクトのデフォルト パッケージにコンポーネント スキャンが含まれている root-context.xml というファイルがあります。私の理解では、このコンテキストには、多くのサーブレットが使用する可能性のあるグローバル Bean が必要です。私の理解は正しいですか?これは他に何をしますか?このファイルを使用して、どのようなコンテキストが作成されますか?

  3. 現在、私はプロジェクトを進めており、contextLoaderListner (web.xml 内) を使用してロードされる *-context.xml ファイル (dao-context.xml、security-context.xml など) がいくつかあります。これは良い考えですか?それとも、すべてを servlet-context.xml に入れる必要がありますか? 関心の分離を提供するので、異なるコンテキストを持つことは良い考えだと思います。コメント? また、これらの *-context.xml ファイルからどのようなコンテキストが作成されますか? これらのファイルの適切なフォルダの場所は?

  4. Web.xml は tomcat などのサーブレット コンテナー用で、プロジェクト内の他のすべての xml ファイルは spring コンテナー用です。あれは正しいですか?これらのファイルはすべて、関心を分離するために分離されていますか?

  5. 現在のシナリオには、いくつのアプリケーション コンテキストと Web アプリケーション コンテキストが存在しますか?

複数のディスパッチャ サーブレットが必要になるのはなぜでしょうか。

なぜ複数のアプリケーション コンテキストが必要になるのでしょうか。

考え?コメント? 修正?ベストプラクティス?

4

2 に答える 2

16

この設計の背後にある全体的な考え方は、典型的な Web アプリケーションでさまざまなアーキテクチャ レイヤーを処理し、コンテキスト全体で Bean の継承/オーバーライド メカニズムを提供することです。Spring の各タイプのコンテキストは、Web レイヤー、サービス レイヤーなどのさまざまなアーキテクチャ レイヤーに関連しています。

Spring ベースの Web アプリケーションでは、複数のディスパッチャー サーブレットを構成できます (ただし、ほとんどの場合、単一のサーブレットですが、それでもディスパッチャー サーブレットはサーブレットであり、web.xml で複数の構成が可能です)。これらは、さまざまな URL パターンを処理するように構成できます。したがって、明らかにそれぞれが異なるサーブレットであるため、異なる Spring Web Application コンテキストを持つことができます。これらには通常、アプリケーションの Web レイヤーに属するため、コントローラー、インターセプター、ビュー リゾルバー、ロケール リゾルバーなどの Spring Web レイヤーのさまざまな構成を含めることができます。これらの構成と Bean はすべて、各ディスパッチャ サーブレットに対してプライベートであるため、互いに見えません。したがって、このプライバシーを有効にするには、別のSpring Webアプリケーションコンテキストを持つことが理にかなっています。ただし、共有されるように設計されているため、ルートコンテキストに属する他の Bean があります。したがって、共有可能なものはすべてルート コンテキストに属し、この Web アプリケーションのグローバルと見なすことができます。

各ディスパッチャ サーブレットは、ルート コンテキストで定義されたすべての Bean を継承します。ただし、注意すべき重要な点は、共有 Bean がそれぞれのディスパッチャー サーブレット固有の Bean によってオーバーライドされる可能性があることです。そのため、Web アプリケーションでは、ルート コンテキストは継承されたものと見なすことができますが、オーバーライドすることができます。

于 2013-10-27T18:10:13.527 に答える