web-dev-qa-db-fra.com

Quelle est la différence entre ApplicationContext et WebApplicationContext dans Spring MVC?

Quelle est la différence entre le contexte d'application et le contexte d'application Web?

Je suis conscient que WebApplicationContext est utilisé pour les applications orientées architecture Spring MVC?

Je veux savoir quelle est l'utilisation de ApplicationContext dans les applications MVC? Et quels types de haricots sont définis dans ApplicationContext?

163
Sumit Trehan

Contexte d'application étendu du contexte d'application Web conçu pour fonctionner avec le standard javax.servlet.ServletContext afin qu'il puisse communiquer avec le conteneur. 

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

Les beans, instanciés dans WebApplicationContext, pourront également utiliser ServletContext s'ils implémentent l'interface ServletContextAware. 

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

Il y a beaucoup de choses possibles à faire avec l'instance ServletContext, par exemple, accéder aux ressources WEB-INF (configs xml, etc.) en appelant la méthode getResourceAsStream () . Généralement, tous les contextes d'application définis dans web.xml dans un servlet application sont des contextes d'application Web, cela va à la fois au contexte racine de l'application Web et au contexte d'application du servlet.

En outre, en fonction des capacités du contexte de l'application Web, votre application peut être un peu plus difficile à tester et vous devrez peut-être utiliser MockServletContext class pour les tests.

Différence entre le contexte de servlet et le contexte racine Spring vous permet de créer des hiérarchies de contexte d'application à plusieurs niveaux, de sorte que le bean requis sera extrait du contexte parent s'il n'est pas présent dans le contexte d'application actuel. Dans les applications Web, par défaut, il existe deux niveaux de hiérarchie, les contextes racine et servlet: Servlet and root context

Cela vous permet d'exécuter certains services en tant que singletons pour l'ensemble de l'application (les beans Spring Security et les services d'accès de base à la base de données résident généralement ici) et en tant que services séparés dans les servlets correspondantes pour éviter les conflits de noms entre beans. Par exemple, un contexte de servlet servira les pages Web et un autre implémentera un service Web sans état.

Cette séparation en deux niveaux sort de la boîte lorsque vous utilisez les classes de servlet Spring: pour configurer le contexte d'application racine, vous devez utiliser la balise context-param dans votre 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>

(le contexte de l'application racine est créé par ContextLoaderListener qui est déclaré dans web.xml

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

) et servlet tag pour les contextes d'application du servlet

<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>

Veuillez noter que si init-param sera omis, alors spring utilisera myservlet-servlet.xml dans cet exemple.

Voir aussi: Différence entre applicationContext.xml et spring-servlet.xml dans Spring Framework

213
Boris Treukhov

Pour revenir aux jours de servlet, le fichier web.xml ne peut contenir qu'un seul <context-param>; ainsi, un seul objet de contexte est créé lorsque le serveur charge une application et les données de ce contexte sont partagées entre toutes les ressources (Ex: Servlets et JSP). Cela revient à avoir le nom du pilote de base de données dans le contexte, ce qui ne changera pas. De la même manière, lorsque nous déclarons le paramètre contextConfigLocation dans <contex-param>, Spring crée un objet Contexte d'application.

 <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.myApp.ApplicationContext</param-value>
 </context-param>

Vous pouvez avoir plusieurs Servlets dans une application. Par exemple, vous souhaiterez peut-être gérer les requêtes/secure/* d'une manière et/non-seucre/* d'une autre manière. Pour chacun de ces servlets, vous pouvez avoir un objet de contexte, qui est un WebApplicationContext.

<servlet>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.secure.SecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <url-pattern>/secure/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.non-secure.NonSecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <url-pattern>/non-secure/*</url-patten>
</servlet-mapping>
8
Ben Tennyson

La réponse acceptée est acceptée, mais il existe une explication officielle à ce sujet:

WebApplicationContext est une extension du plain ApplicationContext qui comporte certaines fonctionnalités supplémentaires nécessaires aux applications Web. Il diffère d'un ApplicationContext normal en ce sens qu'il est capable de résoudre des thèmes (voir Utilisation de thèmes) et qu'il sait à quel Servlet il est associé (en ayant un lien vers ServletContext). WebApplicationContext est lié à ServletContext et, à l'aide de méthodes statiques sur la classe RequestContextUtils, vous pouvez toujours rechercher WebApplicationContext si vous avez besoin d'y accéder.

Cité de Référence du cadre Web Spring

A propos, le servlet et le contexte racine sont both webApplicationContext:

Typical context hierarchy in Spring Web MVC

7
Nick Allen

Contexte d'application Web , spécifié par l'interface WebApplicationContext , est un contexte d'application Spring pour une application Web. Il possède toutes les propriétés d'un contexte d'application Spring normal, étant donné que l'interface WebApplicationContext étend l'interface ApplicationContext et ajoute une méthode permettant de récupérer l'API standard Servlet ServletContext pour l'application Web.

Outre les portées standard de beans Spring singleton et prototype, trois portées supplémentaires sont disponibles dans un contexte d'application Web:

  • request - étend une définition de bean unique au cycle de vie d'une seule requête HTTP; c'est-à-dire que chaque requête HTTP a sa propre instance d'un bean créé à l'arrière d'une définition de bean unique
  • session - étend une définition de bean unique au cycle de vie d'une session HTTP
  • application - étend une définition de bean unique au cycle de vie d'un ServletContext
0
DimaSan

ApplicationContext (contexte d'application racine): Chaque application Web Spring MVC comporte un fichier applicationContext.xml configuré en tant que racine de la configuration de contexte. Spring charge ce fichier et crée un contexte d'application pour l'ensemble de l'application . Ce fichier est chargé par le ContextLoaderListener configuré comme paramètre de contexte dans le fichier web.xml. Et il n'y aura qu'un seul applicationContext par application Web.

WebApplicationContext: WebApplicationContext est un contexte d'application prenant en charge le Web, c'est-à-dire qu'il contient des informations sur le contexte de servlet. . Le fichier de configuration webApplicationContext * -servlet.xml est spécifique à un DispatcherServlet. Et, étant donné qu’une application Web peut avoir plusieurs servlets de distributeur configurés pour répondre à plusieurs demandes, il peut exister plusieurs fichiers webApplicationContext par application Web.

0
Hetal Rachh