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
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { App1Config.class };
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/app1/*" };
    }
}
Kotlin
class MyWebAppInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
    override fun getRootConfigClasses(): Array<Class<*>> {
        return arrayOf(RootConfig::class.java)
    }
    override fun getServletConfigClasses(): Array<Class<*>> {
        return arrayOf(App1Config::class.java)
    }
    override fun getServletMappings(): Array<String> {
        return arrayOf("/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>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/root-context.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>app1</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/app1-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>app1</servlet-name>
        <url-pattern>/app1/*</url-pattern>
    </servlet-mapping>
</web-app>
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 .