Cómo obtener Spring ApplicationContext
Primero: comience desde el lugar más familiar
Código de colección de código Java
org.springframework.web.context.ContextLoaderListener
p>Ya estamos muy familiarizados con el párrafo anterior. Entonces, veamos qué logra exactamente.
Código de colección de código Java
clase pública ContextLoaderListenerimplements ServletContextListener{
ContextLoader privado contextLoader
/**
* Inicialice el contexto de la aplicación web raíz.
*/
public voidcontextInitialized(evento ServletContextEvent) {
this.contextLoader = createContextLoader();
this.contextLoader.initWebApplicationContext (event.getServletContext());
}// Se omite lo siguiente
Obviamente, ContextLoaderListener implementa ServeletContextListenet. Al inicializar ServletContext, inicializará Spring. Definitivamente pensarás que la inicialización de Spring debería ser la siguiente. Lo mismo que ServletContext tiene algo que ver, ¿verdad? ¿Importa? ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE como palabra clave código de colección de código Java
if (servletContext.getAttribute( WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null){
throw new IllegalStateException(
"No se puede inicializar contexto porque ya existe un contexto de aplicación raíz presente - " <
"¡Compruebe si tiene varias definiciones de ContextLoader* en su web.xml!");
}
prueba {
// Determina el padre para el contexto de la aplicación web raíz, si lo hay.
ApplicationContext parent = loadParentContext(servletContext);
// It está disponible al cerrar ServletContext.
this.context = createWebApplicationContext(servletContext, parent);
//Coloque ApplicationContext en ServletContext y el valor clave es WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTEColección de códigos Java código
servletContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE.
setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
//Coloque ApplicationContext en el mapa constante estático global de ContextLoader, la clave es: Thread.currentThread().getContextClassLoader(), que es el hilo actual código de colección de código Java del cargador de clases
currentContextPerThread.put(Thread.currentThread().getContextClassLoader(), this.context);
devuelve this.context;
}
Debe comprender del código anterior que después de la inicialización de Spring, ApplicationContext se guarda en dos lugares, entonces, ¿significa esto que podemos obtener ApplicationContext de dos maneras?
La primera forma de obtener:
Nota: WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() ".ROOT"
Eso es "org. springframework .web.context.WebApplicationContext.ROOT". ROOT"
Entonces no podemos obtener el ApplicationContext de la siguiente manera:
Código de colección de código Java
request.getSession().getServletContext().getAttribute(" org .springframework.web.context.WebApplicationContext.ROOT")