0

Spring/MVC では、どちらのコンテキストで Bean を定義する必要があるかを判断するのに苦労することがよくありroot-context.xmlますservlet-context.xml。混乱の原因は、何をどこに置くべきかについてのドキュメントを見たことがないことです。春のサンプルコードでは、サンプル間で異なるコンテキストで同じものが定義されていることがよくあります。

経験則として、私は現在、サービスまたはコンポーネントをルート コンテキストで定義し、サーブレット コンテキストを Web コントローラー、インターセプター、および Web に関連するものだけに予約しています。

しかし、セキュリティはどうですか?現在、ルート コンテキストのインクルードとして定義していますが、これは正しいですか?

Web コンテキストは実際にはアプリケーション ルート コンテキストの子コンテキストであるという私の理解は正しいですか?

Web コンテキストを分離する必要があるのはなぜですか?

数年前に 3.0 から春のドキュメントを読んだことがありますが、これに固有のことは何も思い出せません。また、Spring in Action、Third Edition も読みました。このトピックに関する資料があれば幸いです。

4

3 に答える 3

1

違いがある可能性があり、通常は違いがあります。

基本的にapplicationContext.xml、ユーザーはルート コンテキストであり、サービスおよびデータ層 Bean が存在する場所です。

*-servlet.xmlまたは、webmvc-config.xml次の点で特別です。

  • 関連DispatcherServletする
  • いつもWebApplicationContext豆工場です
  • ルート コンテキストの子である ( である場合もあるWebApplicationContext)

しかし、人々がこれを行う最大の理由は、単体テスト、バックエンドからフロントエンドを切り離すこと、および個別のビュー リゾルバーおよび/または複数のディスパッチャー サーブレットのためです。

サービス層をテストするためにロードする Bean が少なくなるため、単体テストに適しています。以下のコメントで述べたように、私は通常、本当のapplicationContext.xmlようなものをロードします。

@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext.xml")

また、サーブレット コンテキストにはディスパッチャ サーブレットが必要なため、次のようにサーブレットとして登録する必要があります。

<servlet>
    <servlet-name>my-web</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

したがって、MVC コントローラー Bean をルート コンテキストでロードできるかもしれませんが、ディスパッチャー サーブレットがそのコンテキストを制御しない限り、それらは実際には登録されません。理論的には、クラスパスに構成をロードできると思いますDispatcherServletが、 contextConfigLocation 値がクラスパスにないことに注意してください。

また、通常は 1 つのリゾルバー チェーン (ビュー、ロケール、テーマなど) しか持てないという制限があるため、複数のディスパッチャー サーブレットが必要な人もいます。

于 2012-08-29T04:23:14.270 に答える
1

デフォルトでは<servlet-name>.context.xml、web.xml で DispatcherServlet を指定するだけでチェックされます。contextConfigLocation を指定すると、デフォルトでapplicationContext.xmlparam 値を指定したかどうかがチェックされ、特定のファイルがチェックされます。

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>

それ以外のファイルを指定するには、最初にリスナーを指定する必要があり<servlet-name>.context.xmlます。次に、何も指定しない場合は applicationContext をチェックします。contextConfigLocation を指定すると、カスタム構成メタデータがチェックされます。

于 2012-08-27T13:32:26.833 に答える
1

Web コンテキストを分離する必要があるのはなぜですか?

あなたはそうしない。実際、すべてを詰め込んだ公式の Spring の例がいくつかあります。

それらを別々にしたい理由がいくつかありますおそらく最も有効なのは保守性です。ソース ファイルが小さいほど (そして構成ファイルがソースであるほど)、理解しやすくなります。もう 1 つの理由は、特定のバックエンドが複数のフロントエンドで使用される可能性があることです。

個人的には、フロント エンドとバック エンドを分離してアプリケーション コンテキストを構成し、使用しているバック エンドのコンテキストを単純にインポートするというアイデアが気に入っています。これにより、1 つの「サーブレット」コンテキスト ファイルが残ります。

于 2012-08-27T13:41:12.850 に答える