java spring spring-mvc java-ee servlets

java - ¿Cómo son exactamente el contexto raíz y el contexto del servlet del despachador en una aplicación web Spring MVC?



spring-mvc java-ee (1)

Estoy estudiando Spring MVC y tengo alguna duda relacionada.

Entonces, tengo esta clase de configuración que configura mi DispatcherServlet que maneja las solicitudes del usuario:

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/"); } }

Es bastante claro para mí cómo funciona DispatcherServlet . Mis dudas están relacionadas con el concepto de contexto .

1) ¿Qué representa exactamente un contexto ? Creo que es algo así como un conjunto de beans que tienen un propósito específico y que funcionan juntos en un entorno. Pero no soy absolutamente cierto acerca de esta afirmación.

2) ¿Cuál es la diferencia entre el contexto raíz y el contexto del servlet del despachador ?

3) Por lo que he entendido, los beans definidos en dispatcherContext tienen acceso a los beans definidos en rootContext (pero lo contrario no es cierto). ¿Por qué?

Tnx


Contexto raíz

El contexto raíz en una aplicación Spring es el ApplicationContext que carga ContextLoaderListener . Este contexto debe tener recursos disponibles globalmente como servicios, repositorios, beans de infraestructura ( DataSource , EntityManagerFactory s, etc.), etc.

ContextLoaderListener registra este contexto en el ServletContext bajo el nombre de org.springframework.web.context.WebApplicationContext.ROOT .

Si carga usted mismo un ApplicationContext y lo registra con el nombre de arriba en el ServletContext que luego calificará como el contexto raíz.

Contexto infantil

El contexto secundario en una aplicación Spring es el ApplicationContext que carga un DispatcherServlet (o, por ejemplo, un MessageDispatcherServlet en una aplicación Spring-WS). Este contexto solo debe contener beans relevantes para ese contexto, para Spring MVC que serían ViewResolver s, HandlerMapping s etc.

El servlet registra este contexto en el ServletContext bajo el nombre org.springframework.web.servlet.FrameworkServlet.CONTEXT.<servlet-name> .

Raíz <-Relación infantil

Solo los contextos secundarios tienen acceso al contexto principal, ya que podría tener múltiples contextos secundarios. Por ejemplo, en un Spring MVC combinado con la aplicación Spring WS. El contexto primario es detectado por los hijos al encontrarlo en el ServletContext con el nombre conocido.

Si el contexto raíz tuviera acceso al niño, ¿cuál utilizaría para enviar beans? Además, si ese fuera el caso, también obtendrías resultados sorprendentes cuando AOP esté involucrado. El AOP definido en el contexto hijo influiría repentinamente en los beans configurados en el contexto raíz.