DispatcherServlet espera un WebApplicationContext (una extensión del ApplicationContext normal) para su propia configuración. El WebApplicationContext tiene una referencia al ServletContext y al Servlet al que está asociado. También está vinculado al ServletContext para que las aplicaciones puedan usar los métodos estáticos RequestContextUtils para encontrar el WebApplicationContext si necesitan acceder a él.

Para muchas aplicaciones, es suficiente tener un WebApplicationContext. También es posible tener una jerarquía de contextos en los que un WebApplicationContext raíz sea compartido por múltiples instancias de DispatcherServlet (u otros Servlet), cada una con su propia configuración secundaria WebApplicationContext.

La raíz WebApplicationContext normalmente contiene beans de infraestructura, como almacenes de datos y servicios empresariales, que deben compartirse entre varias instancias de Servlet. Estos beans se heredan efectivamente y se pueden anular (es decir, volver a declarar) en un hijo WebApplicationContext específico del servlet, que generalmente contiene beans locales para ese Servlet. La siguiente imagen muestra esta relación:

El siguiente ejemplo configura la jerarquía WebApplicationContext:

Java
clase pública MyWebAppInitializer extiende AbstractAnnotationConfigDispatcherServletInitializer {
    @Anular
    Clase protegida<?>[] getRootConfigClasses() {
        devolver nueva clase<?>[] { RootConfig.class };
    }
    @Anular
    Clase protegida<?>[] getServletConfigClasses() {
        devolver nueva clase<?>[] { App1Config.class };
    }
    @Anular
    Cadena protegida[] getServletMappings() {
        devolver nueva cadena[] { "/app1/*" };
    }
}
Kotlin
clase MyWebAppInitializer: AbstractAnnotationConfigDispatcherServletInitializer() {
    anular la diversión getRootConfigClasses(): Array<Class<*>> {
        devolver matrizOf(RootConfig::class.java)
    }
    anular la diversión getServletConfigClasses(): Array<Class<*>> {
        devolver matrizOf(App1Config::class.java)
    }
    anular divertido getServletMappings(): Array<String> {
        devolver matrizDe("/app1/*")
    }
}
Si no hay necesidad de una jerarquía de contexto de aplicación, las aplicaciones pueden devolver la configuración completa a través de getRootConfigClasses() y null de getServletConfigClasses().

El siguiente ejemplo muestra el equivalente de web.xml:

<web-app>
    <oyente>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </oyente>
    <parámetro-contexto>
        <nombre-param>contextConfigLocation</nombre-param>
        <valor-param>/WEB-INF/root-context.xml</valor-param>
    </context-param>
    <servlet>
        <nombre-servlet>app1</nombre-servlet>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <nombre-param>contextConfigLocation</nombre-param>
            <valor-param>/WEB-INF/app1-context.xml</valor-param>
        </init-param>
        <cargar al inicio>1</cargar al inicio>
    </servlet>
    <mapeo de servlets>
        <nombre-servlet>app1</nombre-servlet>
        <patrón-url>/app1/*</patrón-url>
    </servlet-mapping>
</aplicación web>
Si no hay necesidad de una jerarquía de contexto de aplicación, las aplicaciones pueden configurar solo el contexto "raíz" y dejar el parámetro de servlet contextConfigLocation vacío .