web-dev-qa-db-fra.com

Comment sont exactement le contexte racine et le contexte de servlet du répartiteur dans une application Web Spring MVC?

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

23
AndreaNobili

Contexte racine

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, EntityManagerFactorys 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.

Contexte enfant

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 ViewResolvers, HandlerMappings etc.

Le servlet enregistre ce contexte dans le ServletContext sous le nom org.springframework.web.servlet.FrameworkServlet.CONTEXT.<servlet-name>.

Racine <-Enfant Relation

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.

32
M. Deinum