Contexte racine et enfant Avant de poursuivre la lecture, veuillez comprendre que -
Spring peut avoir plusieurs contextes à la fois. L'un d'eux sera le contexte racine, et tous les autres contextes seront des contextes enfants.
Tous les contextes enfants peuvent accéder aux beans définis dans le contexte racine; mais le contraire n'est pas vrai. Le contexte racine ne peut pas accéder aux beans de contextes enfants.
ApplicationContext:
applicationContext.xml est la configuration du contexte racine pour chaque application Web. Spring charge le fichier applicationContext.xml et crée le ApplicationContext 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 à l'aide du paramètre contextConfigLocation, Spring recherchera l'applicationContext.xml sous le dossier WEB-INF et lèvera FileNotFoundException s'il n'a pas pu trouver ce fichier.
ContextLoaderListener Effectue le travail d'initialisation réel pour le contexte d'application racine. Lit un paramètre de contexte «contextConfigLocation» et transmet sa valeur à l'instance de contexte, l'analysant en plusieurs chemins de fichiers potentiellement séparés par un nombre quelconque de virgules et d'espaces, par exemple «WEB-INF / applicationContext1.xml, WEB-INF / applicationContext2.xml ». ContextLoaderListener est facultatif. Juste pour faire un point ici: vous pouvez démarrer une application Spring sans jamais configurer ContextLoaderListener, juste un web.xml minimum de base avec DispatcherServlet.
DispatcherServlet DispatcherServlet est essentiellement un servlet (il étend HttpServlet) dont le but principal est de gérer les demandes Web entrantes correspondant au modèle d'URL configuré. Il prend un URI entrant et trouve la bonne combinaison de contrôleur et de vue. C'est donc le contrôleur frontal.
Lorsque vous définissez un DispatcherServlet dans la configuration Spring, vous fournissez un fichier XML avec des entrées de classes de contrôleur, des mappages de vues, etc. à l'aide de l'attribut contextConfigLocation.
WebApplicationContext Outre ApplicationContext, il peut y avoir plusieurs WebApplicationContext dans une seule application Web. En termes simples, chaque DispatcherServlet est associé à un seul WebApplicationContext. Le fichier xxx-servlet.xml est spécifique au DispatcherServlet et une application Web peut avoir plus d'un DispatcherServlet configuré pour gérer les demandes. Dans de tels scénarios, chaque DispatcherServlet aurait un xxx-servlet.xml distinct configuré. Mais, applicationContext.xml sera commun à tous les fichiers de configuration de servlet. Spring chargera par défaut le fichier nommé «xxx-servlet.xml» à partir du dossier WEB-INF de votre webapps où xxx est le nom du servlet dans web.xml. Si vous souhaitez changer le nom de ce nom de fichier ou changer l'emplacement, ajoutez initi-param avec contextConfigLocation comme nom de paramètre.
Comparaison et relation entre eux:
ContextLoaderListener et DispatcherServlet
ContextLoaderListener crée un contexte d'application racine. Les entrées DispatcherServlet créent un contexte d'application enfant par entrée de servlet. Les contextes enfants peuvent accéder aux beans définis dans le contexte racine. Les beans dans le contexte racine ne peuvent pas accéder aux beans dans les contextes enfants (directement). Tous les contextes sont ajoutés à ServletContext. Vous pouvez accéder au contexte racine à l'aide de la classe WebApplicationContextUtils.
Après avoir lu la documentation Spring, voici la compréhension:
a) Les contextes d'application sont hiérarchisés, tout comme les contextes d'application Web. Reportez-vous à la documentation ici.
b) ContextLoaderListener crée un contexte d'application Web racine pour l'application Web et le place dans ServletContext. Ce contexte peut être utilisé pour charger et décharger les beans gérés par Spring indépendamment de la technologie utilisée dans la couche contrôleur (Struts ou Spring MVC).
c) DispatcherServlet crée son propre WebApplicationContext et les gestionnaires / contrôleurs / résolveurs de vues sont gérés par ce contexte.
d) Lorsque ContextLoaderListener est utilisé en tandem avec DispatcherServlet, un contexte d'application Web racine est créé en premier comme indiqué précédemment et un contexte enfant est également créé par DispatcherSerlvet et est attaché au contexte d'application racine. Reportez-vous à la documentation ici.
Lorsque nous travaillons avec Spring MVC et que nous utilisons également Spring dans la couche de services, nous fournissons deux contextes d'application. Le premier est configuré avec ContextLoaderListener et l'autre avec DispatcherServlet
En règle générale, vous définirez tous les beans liés à MVC (contrôleur et vues, etc.) dans le contexte DispatcherServlet, et tous les beans transversaux tels que la sécurité, les transactions, les services, etc. au contexte racine par ContextLoaderListener.
Référez-vous à ceci pour plus de détails:
https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html