J'étudie Spring MVC et j'ai quelques doutes liés
Donc, j'ai cette classe de configuration qui configure mon DispatcherServlet qui gère les demandes des utilisateurs:
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
// Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext = ...
// Create the dispatcher servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
dispatcherContext.register(DispatcherConfig.class);
// Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher = container.addServlet("main", new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("main/");
}
}
Il est assez clair pour moi comment fonctionne DispatcherServlet. Mes doutes sont liés au concept context.
1) Que représente exactement un contexte? Je pense que c'est quelque chose comme un ensemble de haricots qui ont un but spécifique et qui fonctionnent mieux dans un environnement. Mais je ne suis absolument pas vrai au sujet de cette affirmation.
2) Quelle est la différence entre le contexte racine et le contexte de servlet du répartiteur?
3) D'après ce que j'ai compris, les beans définis dans dispatcherContext ont accès aux beans définis dans rootContext (mais l'inverse n'est pas vrai). Pourquoi?
Tnx
Le contexte racine dans une application Spring est le ApplicationContext
qui est chargé par le ContextLoaderListener
. Ce contexte doit disposer de ressources disponibles à l'échelle mondiale comme les services, les référentiels, les beans infrastructure (DataSource
, EntityManagerFactory
s etc.) etc.
Le ContextLoaderListener
enregistre ce contexte dans le ServletContext
sous le nom org.springframework.web.context.WebApplicationContext.ROOT
.
Si vous chargez vous-même un ApplicationContext
et l'enregistrez avec le nom ci-dessus dans le ServletContext
qui sera alors qualifié de racine-contexte.
Le contexte enfant dans une application Spring est le ApplicationContext
qui est chargé par un DispatcherServlet
(ou par exemple un MessageDispatcherServlet
dans une application Spring-WS). Ce contexte ne doit contenir que des beans pertinents pour ce contexte, pour Spring MVC qui serait ViewResolver
s, HandlerMapping
s etc.
Le servlet enregistre ce contexte dans le ServletContext
sous le nom org.springframework.web.servlet.FrameworkServlet.CONTEXT.<servlet-name>
.
Seuls les contextes enfants ont accès au contexte parent, car vous pouvez avoir plusieurs contextes enfants. Par exemple, dans un Spring MVC combiné avec une application Spring WS. Le contexte parent est détecté par les enfants en le trouvant dans le ServletContext
avec le nom bien connu.
Si le contexte racine avait accès à l'enfant, lequel utiliserait-il pour câbler les beans? À côté de cela, si tel était le cas, vous obtiendriez également des résultats surprenants lorsque l'AOP est impliqué. Un AOP défini dans le contexte enfant influencerait soudainement les beans configurés dans le contexte racine.