En una aplicación web basada en el marco de Spring, ¿cómo se applicationgContext.xml
carga automáticamente el archivo de configuración de contexto de aplicación de Spring ?
Al ejecutar un proyecto web, el servidor de aplicaciones (JBoss, Tomcat, etc.) primero leerá los web.xml
archivos en la ruta de origen del proyecto , analizará la configuración en él y encontrará la configuración ContextLoaderListener
, por lo que ejecutará ContextLoaderListener
el contextInitialized
método en la clase, y se llamará al initWebApplicationContext()
método en este método De acuerdo con el nombre del método, podemos ver que este método se utiliza para inicializar un WebApplicationContext. El simple entendimiento es inicializar un contenedor Spring en una aplicación web. En la initWebApplicationContext()
implementación del código posterior del método, el archivo especificado se cargará de acuerdo web.xml
con las contextConfigLocation
propiedades configuradas en el método applicationContext.xml
, y el contenedor Spring se inicializará de acuerdo con este archivo.
Si no web.xml
hay contextConfigLocation
parámetros de configuración , ¿no se puede cargar el applicationgContext.xml
archivo?
Si no hay contextConfigLocation
parámetros de configuración , la aplicación buscará el /WEB-INF/applicationContext.xml
archivo en el directorio raíz de la aplicación de forma predeterminada , es decir, esta es una ruta de archivo que se carga de forma predeterminada.
Después de completar la inicialización de WebApplicationContext en esta aplicación web, ¿qué tiene que ver con ServletContext?
En initWebApplicationContext
el interior del método de inicialización se context
guardar en ServletContext
, en particular, se mantiene a un Map
atributo de tipo, key
es WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
, value
es un ejemplo específico de un WebApplicationContext objeto.
Si desea ServletContext
obtener esto en el código WebApplicationContext
, ¿cómo hacerlo?
El marco Spring proporciona una WebApplicationContextUtils
clase de herramienta, que getWebApplicationContext
se puede obtener a través del método de esta clase de herramienta .
Justo ahora ServletContext
, ¿para qué se usa?
ServletContext
Algunos métodos se definen para facilitar la comunicación Servlet
con el Servlet
contenedor. En una aplicación web, todos Servlet
son comunes ServletContext
. Cuando Spring se usa junto con una aplicación web, el contenedor Spring se almacena ServletContext
en él. En términos simples, se ApplicationContext
almacena en un ServletContext
contenedor. En una propiedad de Mapa.
Tenía que entender web.xml
en Listener
, Filter
y la Servlet
orden de inicialización que?
Primero, <listener>
cree una instancia de la clase de escucha declarada con la etiqueta, llame al método del objeto de instancia de clase de escucha contextInitialized()
, inicialice los datos de contexto de la aplicación, luego <filter>
cree una instancia de la clase de filtro declarada con la etiqueta y llame al método del objeto de instancia de clase de filtro init()
; Si <servlet>
se usa una etiqueta en la <load-on-startup>
etiqueta, se Servlet
instancia en orden desde el valor más pequeño hasta el valor más grande , y init()
se llama al método correspondiente .
Hablando de eso Servlet
, DispatcherServlet
¿alguien en Spring MVC lo sabía? ¿Cuéntame sobre su principio de implementación?
DispatcherServlet
Es el distribuidor principal de SpringMVC. Implementa la distribución de solicitudes y es el punto de entrada para procesar solicitudes. Es uno Servlet
. Cuando se inicia la aplicación, la DispatcherServlet
inicialización ejecutará el init
método. DispatcherServlet
El init
método que se encuentra en el código fuente hereda de él HttpServletBean
. En este método de inicialización, se instanciará un WebApplicationContext
objeto, y la inicialización se context
almacenará ServletContext
en él Servlet
para asociarlo con el contenedor Spring. En DispatcherServlet
el onRefresh
método, inicializar varias estrategias de procesamiento de solicitudes, tales como la carga de archivos Políticas, estrategia solicitud de procesamiento URL, ver la estrategia de proceso de mapeo, las estrategias de manejo de excepciones, la mayor parte de la puesta en práctica de estas estrategias son un lógico iniciar WebApplicationContext
la búsqueda, no pudo encontrar En el caso de la recarga , las diversas estrategias en el DispatcherServlet
mismo directorio DispatcherServlet.properties
, como la inicialización HandlerMapping
, el registro de diversas estrategias de procesamiento de solicitudes y clases de procesamiento.
Específicamente, ¿cómo funciona la DispatcherServlet
distribución de solicitudes?
En primer lugar, Marco del resorte MVC en el arranque atravesará todos recipiente resorte bean, por marcados @Controller
o @RequestMapping
método clases anotadas de atravesar las clases superiores y métodos @RequestMapping
valores combinados anotados, @RequestMapping
anotaciones relacionadas valor de parámetro (por ejemplo value
, method
etc.) un paquete RequestMappingInfo
, este Controller
ejemplo, el método y la información de parámetros método (tipo, anotaciones, etc.) en el paquete HandlerMethod
, y luego a RequestMappingInfo
como key
, HandlerMethod
para value
mantener a una a Map
una estructura de handlerMethods
la.
A continuación, la @RequestMapping
anotación de value
(es decir, una petición de ruta) valores tomados, que es url
y, a continuación, url
a key
fin RequestMappingInfo
de value
, en un depósito a Map
una estructura de la urlMap
propiedad.
Cuando el cliente envía una solicitud, de conformidad con una solicitud URL
para urlMap
buscar, localizar RequestMappingInfo
, y entonces, de acuerdo RequestMappingInfo
a la handlerMethods
consulta, para encontrar la que corresponde HandlerMethod
, entonces HandlerMethod
encapsulado HandlerExecutionChain
; a continuación, iterar a través de todos los contenedores de HandlerAdapter
clase de implementación, encontrar apoyo esta solicitud HandlerAdapter
, como RequestMappingHandlerAdapter
, a continuación, ejecutar El método frontal ( preHandle
método) del interceptor Spring MVC , luego analiza y convierte los parámetros de solicitud, y luego (usando la reflexión) llama al Controller
método correspondiente específico para devolver un ModelAndView
objeto, ejecuta el método ( postHandle
método) posterior del interceptor y luego devuelve el resultado Realice el procesamiento y finalmente ejecute el afterCompletion
método.