Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo obtener Spring ApplicationContext

Cómo obtener Spring ApplicationContext

En el desarrollo WEB, rara vez es necesario obtener ApplicationContext para obtener algunos beans administrados por Spring. Hoy me encontré con una situación así. Aquí me gustaría compartir con ustedes cómo obtener ApplicationContext en el desarrollo WEB. > 1. Cómo obtener ApplicationContext Primero, debe comprender cómo se almacena el ApplicationContext interno de Spring. Para obtener ApplicationContext, primero debe comprender cómo se almacena el ApplicationContext interno de Spring. Rastreemos el código fuente

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")