- Sont
applicationContext.xml
et sontspring-servlet.xml
liés de toute façon dans Spring Framework? - Les fichiers de propriétés déclarés dans
applicationContext.xml
seront-ils disponiblesDispatcherServlet
? - Sur une note connexe, pourquoi ai-je besoin d'un
*-servlet.xml
? PourquoiapplicationContext.xml
seul est- il insuffisant?
373
Réponses:
Spring vous permet de définir plusieurs contextes dans une hiérarchie parent-enfant.
Le
applicationContext.xml
définit les beans pour le "contexte racine webapp", c'est-à-dire le contexte associé à la webapp.Le
spring-servlet.xml
(ou tout autre nom que vous appelez) définit les beans pour le contexte d'application d'un servlet. Il peut y en avoir plusieurs dans une webapp, une par servlet Spring (par exemplespring1-servlet.xml
pour servletspring1
,spring2-servlet.xml
pour servletspring2
).Les beans in
spring-servlet.xml
peuvent référencer les beans inapplicationContext.xml
, mais pas l'inverse.Tous les contrôleurs Spring MVC doivent aller dans le
spring-servlet.xml
contexte.Dans la plupart des cas simples, le
applicationContext.xml
contexte n'est pas nécessaire. Il est généralement utilisé pour contenir des beans partagés entre tous les servlets d'une application Web. Si vous n'avez qu'une seule servlet, il n'y a pas vraiment d'intérêt, à moins que vous n'en ayez une utilisation spécifique.la source
Scénario 1
Dans l'application client (l'application n'est pas une application Web, par exemple peut être une application swing)
Pas besoin de web.xml . ApplicationContext comme conteneur pour obtenir le service de bean. Pas besoin de conteneur de serveur Web. Dans test-client.xml, il peut y avoir un bean simple sans accès à distance, un bean avec accès à distance.
Conclusion : dans le scénario 1 applicationContext et
DispatcherServlet
ne sont pas liés.Scénario 2
Dans une application serveur (application déployée sur le serveur par exemple Tomcat). Service accessible via la télécommande depuis le programme client (par exemple, l'application Swing)
Définir l'écouteur dans web.xml
Au démarrage du serveur,
ContextLoaderListener
instancie les beans définis dans applicationContext.xml .En supposant que vous ayez défini les éléments suivants dans applicationContext.xml :
Les beans sont instanciés à partir des quatre fichiers de configuration test1.xml , test2.xml , test3.xml , test4.xml .
Conclusion : dans le scénario 2 applicationContext et
DispatcherServlet
ne sont pas liés.Scénario 3
Dans une application web avec ressort MVC.
Dans web.xml, définissez:
Au démarrage de Tomcat, les beans définis dans springweb-servlet.xml sont instanciés.
DispatcherServlet
s'étendFrameworkServlet
. Dans leFrameworkServlet
haricot, l'instanciation a lieu pour le springweb. Dans notre cas, springweb est FrameworkServlet.Conclusion : dans le scénario 3 applicationContext et
DispatcherServlet
ne sont pas liés.Scénario 4
Dans l'application web avec ressort MVC. springweb-servlet.xml pour servlet et applicationContext.xml pour accéder au service métier dans le programme serveur ou pour accéder au service DB dans un autre programme serveur.
Dans web.xml, les éléments suivants sont définis:
Au démarrage du serveur,
ContextLoaderListener
instancie les beans définis dans applicationContext.xml ; en supposant que vous avez déclaré ici:Les beans sont tous instanciés à partir des quatre test1.xml , test2.xml , test3.xml , test4.xml . Une fois l'instanciation du bean définie dans applicationContext.xml terminée , les beans définis dans springweb-servlet.xml sont instanciés.
Donc l'ordre d'instanciation est: la racine (contexte d'application), puis FrameworkServlet.
Maintenant, il devrait être clair pourquoi ils sont importants dans quel scénario.
la source
DispatcherServlet
ne sera pas appelé si l'url ne se termine pas par .action?Un dernier point que je veux ajouter. En
spring-servlet.xml
nous incluons analyse composants pour package Controller. Dans l'exemple suivant, nous incluons une annotation de filtre pour le package du contrôleur.Dans
applicationcontext.xml
nous ajoutons un filtre pour le paquet restant à l'exclusion du contrôleur.la source
@Controller
beans dans le contexte de servlet (requis par Spring MVC).En termes simples,
applicationContext.xml
définit les beans partagés entre toutes les servlets. Si votre application possède plusieurs servlets, la définition des ressources communes dans leapplicationContext.xml
serait plus logique.spring-servlet.xml
définit les beans associés uniquement à cette servlet. Ici, c'est le servlet du répartiteur. Ainsi, vos contrôleurs Spring MVC doivent être définis dans ce fichier.Il n'y a rien de mal à définir tous les beans dans le
spring-servlet.xml
si vous exécutez un seul servlet dans votre application Web.la source
Dans la technologie des servlets, si vous souhaitez transmettre une entrée à un servlet particulier, vous devez passer les paramètres init comme le code ci-dessous.
Si vous souhaitez passer des entrées communes à toutes les servlets, vous devez alors configurer le paramètre de contexte. Exemple
Tellement exactement comme cela lorsque nous travaillons avec Spring MVC, nous devons fournir des informations au servlet prédéfini fourni par Spring, qui est DispatcherServlet via init param. La configuration est donc en jachère, nous fournissons ici le paramètre spring-servlet.xml en tant que paramètre init à DispatcherServlet.
Encore une fois, nous avons besoin d'un paramètre de contexte. Cela s'applique à toute l'application. Nous pouvons donc fournir le contexte racine qui est applicationcontext.xml La configuration est la suivante:
la source
Les contextes d'application fournissent un moyen de résoudre les messages texte, notamment la prise en charge de i18n de ces messages. Les contextes d'application fournissent un moyen générique de charger des ressources de fichiers, telles que des images. Les contextes d'application peuvent publier des événements sur des beans enregistrés comme écouteurs. Certaines opérations sur le conteneur ou les beans du conteneur, qui doivent être gérées de manière programmatique avec une fabrique de beans, peuvent être gérées de manière déclarative dans un contexte d'application. Prise en charge de ResourceLoader: l'interface des ressources de Spring nous fournit une abstraction générique flexible pour gérer les ressources de bas niveau. Un contexte d'application lui-même est un ResourceLoader, donc fournit une application avec accès aux instances de ressources spécifiques au déploiement. Prise en charge de MessageSource: le contexte d'application implémente MessageSource, une interface utilisée pour obtenir des messages localisés,
la source