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

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 MVC de printemps axées sur l'architecture?

je veux savoir à quoi sert ApplicationContext dans les applications MVC? Et quel genre de haricots sont définis dans ApplicationContext ?

160
demandé sur Cœur 2012-07-29 15:44:12

4 réponses

contexte d'Application Web étendue de Contexte de l'Application qui est conçu pour fonctionner avec la norme javax.servlet.ServletContext donc il est capable de communiquer avec le conteneur.

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

les Haricots, instancié dans WebApplicationContext sera également en mesure d'utiliser ServletContext s'ils mettent en œuvre ServletContextAware interface

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

il y a beaucoup de choses à faire avec le ServletContext exemple: accès à des ressources WEB-INF (configuration xml, etc.)) en appelant la méthode getResourceAsStream (). Typiquement tous les contextes d'application définis dans web.xml dans une application servlet Spring sont des contextes D'Application Web, cela va à la fois dans le contexte de la racine webapp et le contexte de l'application servlet.

aussi, selon les capacités de contexte d'application web peut rendre votre application un peu plus difficile à tester, et vous pouvez avoir besoin d'utiliser MockServletContext Classe pour les essais.

la Différence entre la servlet et de la racine de contexte Spring vous permet de construire des hiérarchies de contexte d'application à plusieurs niveaux, de sorte que le bean requis sera récupéré 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 root et servlet: Servlet and root context .

Cela permet d'exécuter certains services comme les singletons pour l'ensemble de l'application (Spring Security beans et basic database access services résident généralement ici) et un autre comme services séparés dans les servlets correspondants pour éviter les conflits de nom entre les haricots. Par exemple, un contexte servlet servira les pages web et un autre mettra en place un service web apatride.

cette séparation à deux niveaux sort de la boîte lorsque vous utilisez les classes de servlet à ressort: pour configurer l'application racine contexte vous devez utiliser la balise context-param dans votre site 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 pour la servlet contextes applicatifs

<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 est omis, alors spring utilisera myservlet-servlet.xml dans cet exemple.

Voir aussi: Difference between application context.xml et spring-servlet.xml in Spring Framework

207
répondu Boris Treukhov 2017-05-23 12:26:06

ApplicationContext applicationcontexte.xml est la configuration de contexte racine pour chaque application web. Le contexte d'application des charges de ressort.xml et crée le contexte applicatif pour l'ensemble de l'application. Il n'y aura qu'un seul contexte d'application par application web. Si vous ne déclarez pas explicitement le nom du fichier de configuration de contexte dans web.xml en utilisant le param contextConfigLocation, Spring recherchera le context applicationcon.xml sous WEB-INF dossier et lancer FileNotFoundException s'il ne pouvait pas trouver ce fichier.

WebApplicationContext En dehors de ApplicationContext, il peut y avoir plusieurs WebApplicationContext dans une seule application web. En termes simples, chaque Répartiteurservlet associé à un contexte Webapplicationunique. xxx-servlet.le fichier xml est spécifique au répartiteur et une application web peut avoir plus d'un répartiteur configuré pour traiter les requêtes. Dans dans ces scénarios, chaque répartiteur aurait un xxx-servlet distinct.xml configuré. Mais, applicationContext.xml sera commun à tous les servlet fichiers de configuration. Spring chargera par défaut un fichier nommé "xxx-servlet.xml" à partir de votre dossier webapps WEB-INF où xxx est le nom de servlet dans web.XML. Si vous voulez changer le nom de ce fichier ou l'emplacement, ajoutez initi-param avec contextConfigLocation comme nom de param.

30
répondu JavaDev 2015-04-14 14:19:23

en remontant à la Servlet jours, web.xml ne peut avoir qu'un seul <context-param> , de sorte qu'un seul objet de contexte est créé lorsque le serveur charge une application et que les données dans ce contexte sont partagées entre toutes les ressources (Ex: Servlets et JSPs). C'est la même chose que d'avoir un nom de pilote de base de données dans le contexte, qui ne changera pas. De la même manière, lorsque nous déclarons contextConfigLocation param dans <contex-param> Spring crée un objet de contexte D'Application.

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

vous pouvez plusieurs Servlets dans une application. Par exemple, vous pourriez vouloir traiter 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 contextuel, 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>
7
répondu Ben Tennyson 2017-07-10 19:17:57

Les accepté de répondre est de travers, mais il y a explication officielle sur ce point:

le WebApplicationContext est une extension du plain ApplicationContext qui possède certaines fonctionnalités supplémentaires nécessaires pour les applications web. Elle se distingue d'un Contexteapplication normal en ce qu'elle est capable de résoudre des thèmes (voir utilisation des thèmes), et qu'elle sait à quel Servlet elle est associée (en ayant un lien vers le ServletContext). Le contexte Webapplicationest lié dans le ServletContext, et en utilisant des méthodes statiques sur la classe RequestContextUtils, vous pouvez toujours consulter le WebApplicationContext si vous avez besoin d'y accéder.

Cités de Spring framework web de référence

par la façon servlet et le contexte de racine sont à la fois webApplicationContext:

Typical context hierarchy in Spring Web MVC

4
répondu Nick Allen 2017-09-13 13:46:03