1. ホーム
  2. spring

[解決済み】Spring MVCのApplicationContextとWebApplicationContextの違いは何ですか?

2022-04-14 05:43:50

質問

アプリケーションコンテキストとWebアプリケーションコンテキストの違いは何ですか?

私は、以下のように認識しています。 WebApplicationContext は、Spring MVCアーキテクチャ指向のアプリケーションに使用されるのですか?

をどのように使うのか知りたい。 ApplicationContext MVCアプリケーションでは?また、どのようなビーンが ApplicationContext ?

解決方法は?

Web Application コンテキストは、標準的なアプリケーションコンテキストを拡張したものです。 javax.servlet.ServletContext で、コンテナと通信できるようになります。

public interface WebApplicationContext extends ApplicationContext {
    ServletContext getServletContext();
}

WebApplicationContextでインスタンス化されたビーンも、ServletContextAwareインターフェースを実装すれば、ServletContextを使用できるようになります。

package org.springframework.web.context;
public interface ServletContextAware extends Aware { 
     void setServletContext(ServletContext servletContext);
}

ServletContextインスタンスでできることはたくさんあります。たとえば、getResourceAsStream()メソッドを呼んでWEB-INFリソース(xml設定など)にアクセスすることが挙げられます。 通常、Springアプリケーションのweb.xmlで定義されたアプリケーションコンテキストはすべてWebアプリケーションコンテキストであり、これはルートのWebアプリケーションコンテキストとサーブレットのアプリケーションコンテキストの両方に当てはまります。

また、ウェブアプリケーションコンテキストの機能によっては、アプリケーションのテストが少し難しくなる場合があり、その場合は MockServletContext クラスでテストすることができます。

サーブレットとルートコンテキストの違い Springではアプリケーションコンテキストを多段階で構築できるため、必要なBeanが現在のアプリケーションコンテキストに存在しない場合、親コンテキストから取得されることになります。Webアプリケーションでは、デフォルトでルートコンテキストとサーブレットコンテキストの2つの階層が存在します。 .

これにより、あるサービスはアプリケーション全体のシングルトンとして実行し(Spring Security Beanや基本的なデータベースアクセスサービスは通常ここに存在します)、別のサービスは対応するサーブレットで分離したサービスとして実行し、Bean間の名前の衝突を回避することができます。例えば、あるサーブレットコンテキストはウェブページを提供し、別のサーブレットコンテキストはステートレスなウェブサービスを実装することになります。

この2レベルの分離は、spring サーブレットクラスを使用する際に、すぐに実現できます。 コンテキストパラメータ タグを web.xml に記述します。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/root-context.xml
            /WEB-INF/applicationContext-security.xml
    </param-value>
</context-param>

(ルートアプリケーションコンテキストを作成するのは ContextLoaderListener これは web.xml で宣言されています。

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> 

) と サーブレット タグは、サーブレットアプリケーションのコンテキスト

<servlet>
   <servlet-name>myservlet</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>app-servlet.xml</param-value>
   </init-param>
</servlet>

init-paramが省略された場合、springはこの例ではmyservlet-servlet.xmlを使用することになることに注意してください。

こちらもご覧ください。 Spring FrameworkにおけるapplicationContext.xmlとspring-servlet.xmlの相違点