[Serie Spring Boot] - Escucha de Spring Boot Listener

[Serie Spring Boot] - Escucha de Spring Boot Listener


Insertar descripción de la imagen aquí

I. Descripción general

¿Qué es un oyente web? Los oyentes web son clases especiales en Servlets . Pueden ayudar a los desarrolladores a monitorear eventos específicos en la web, como la creación y destrucción de ServletContext, HttpSession y ServletRequest; la creación, destrucción y modificación de variables, etc. Puede agregar procesamiento antes y después de ciertas acciones para implementar el monitoreo, etc. Hay muchos escenarios de uso para los oyentes web: el oyente de Spring es un patrón de observador que puede desacoplar directamente eventos de los oyentes de eventos;

2. Clasificación del oyente

2.1 Escuchar el detector de eventos de ServletContext

Son: ServletContextListener, ServletContextAttributeListener. A nivel de Aplicación, solo hay una para toda la aplicación y se puede configurar globalmente.

2.2 Escuchar el detector de eventos de HttpSeesion

Son: HttpSessionListener, HttpSessionAttributeListener. Nivel de sesión, para cada objeto, como contar el número total de sesiones.

2.3 Oyente de eventos para escuchar ServletRequest

Son: ServletRequestListener, ServletRequestAttributeListener. Nivel de solicitud, para cada solicitud de cliente.

3. Oyentes en SpringMVC

3.1 ContextLoaderListener

Al iniciar el contenedor web, la información de configuración de Spring applicationContext.xml se ensambla automáticamente. Debido a que implementa la interfaz ServletContextListener, configure este oyente en web.xml y, cuando se inicie el contenedor, el método que implementa se ejecutará de forma predeterminada. La clase ContextLoader está asociada con ContextLoaderListener, por lo que ContextLoader completa todo el proceso de carga y configuración.

La siguiente es la configuración de ContextLoaderListener y contexto en web.xml

<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

parámetro-contexto

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

ServletContextListener es el oyente de ServletContext. Si ServletContext cambia, por ejemplo, ServletContext se crea cuando se inicia el servidor y ServletContext se destruirá cuando el servidor se apague.

3.2 SolicitudContextEscuchar

Vincule el objeto de solicitud HTTP al subproceso que atiende la solicitud según LocalThread. Esto permite acceder a beans con solicitud y alcance de sesión más adelante en la cadena de llamadas.

  • Alcance de la solicitud
<bean id="loginAction" class="com.goyeer.LoginAction" scope="request"/>  

Para cada solicitud HTTP, el contenedor Spring creará una nueva instancia del bean LoginAction basada en la definición del bean loginAction, y la instancia del bean loginAction solo es válida dentro de la solicitud HTTP actual, por lo que puede cambiar de forma segura el estado interno de la instancia creada según sea necesario. , mientras que otras Instancias creadas a partir de la definición del bean loginAction en una solicitud no verán estos cambios de estado específicos de la solicitud. Cuando finaliza el procesamiento de la solicitud, la instancia de bean en el alcance de la solicitud se destruirá.

  • Alcance de la sesión
<bean id="user" class="com.goyeer.User" scope="session"/>

Para una determinada sesión HTTP, el contenedor Spring creará una nueva instancia de bean userPreferences basada en la definición del bean userPreferences, y el bean userPreferences solo es válido dentro de la sesión HTTP actual. Al igual que el alcance de la solicitud, puede cambiar de forma segura el estado interno de la instancia creada según sea necesario, mientras que las instancias creadas según las preferencias del usuario en otras sesiones HTTP no verán estos cambios de estado específicos de una determinada sesión HTTP. Cuando finalmente se descarte la sesión HTTP, los beans dentro del alcance de la sesión HTTP también se descartarán.

  • alcance de la sesión global
<bean id="userPrefere" class="com.goyeer.userPrefere" scope="globalSession"/> 

El alcance de la sesión global es similar al alcance de la sesión HTTP estándar, pero solo tiene sentido en aplicaciones web basadas en portlets. La especificación de portlet define el concepto de sesión global, que es compartida por todos los diferentes portlets que componen una aplicación web de portlet. Los beans definidos en el ámbito de la sesión global están limitados al ámbito del ciclo de vida de la sesión del portlet global. Tenga en cuenta que si está escribiendo una aplicación web estándar basada en Servlet y define uno o más beans con alcance de sesión global, el sistema utilizará el alcance de sesión HTTP estándar y no causará ningún error.

3.3 IntrospectorCleanupListener

  • El papel y el impacto de Introspector

Antes de analizar IntrospectorCleanupListener, primero comprendamos Introspector. Introspector es una clase del paquete java.beans en el JDK que proporciona un método estándar para que el JavaBean de destino comprenda los métodos, propiedades y eventos de la clase original. En términos sencillos, puede crear un objeto BeanInfo a través de Introspector, y este objeto BeanInfo contiene información de descripción de propiedades, métodos y eventos en la clase de destino, y luego puede usar este objeto BeanInfo para realizar operaciones relacionadas en el objeto de destino.

Introspector indirectamente tiene una fuerte referencia a BeanInfo. Si utiliza el Introspector para operar muchas clases, el Introspector indirectamente tendrá fuertes referencias a estos BeanInfos. Cuando se produce la recolección de basura, si se detecta que estos BeanInfos tienen cadenas de referencia, el recolector de basura no reciclará estas clases y los cargadores de clases correspondientes, lo que provocará pérdidas de memoria. Por lo tanto, para resolver este problema, una vez completada la operación con Introspector, llame al método flushCaches de la clase Introspector para borrar el caché.

  • PlaceIntrospectorCleanupListener

Este oyente se utiliza principalmente para resolver el problema de pérdida de memoria causado por java.beans.Introspector. El propósito de la clase java.beans.Introspector en el JDK es descubrir si una clase Java cumple con la especificación JavaBean. Si algún framework o programa utiliza la clase Introspector, se habilitará un caché a nivel de sistema, que almacenará referencias a algunos JavaBeans que hayan sido cargados y analizados. Cuando se apaga el servidor web, debido a que estas referencias de JavaBean se almacenan en esta caché, el recolector de basura no puede reciclar los objetos JavaBean en el contenedor web, lo que eventualmente hace que la memoria aumente. org.springframework.web.util.IntrospectorCleanupListener es una clase auxiliar especialmente utilizada para lidiar con pérdidas de memoria de Introspector. IntrospectorCleanupListener limpiará la caché de Introspector cuando el servidor web se detenga para que el recolector de basura pueda reciclar correctamente esos Javabeans. Spring en sí no tiene este problema, porque Spring se actualizará inmediatamente después de cargar y analizar una clase. java.beans.-Caché de Introspector, que garantiza que este problema de pérdida de memoria no ocurrirá en Spring. Sin embargo, algunos programas y marcos no se limpian después de usar JavaBeans Introspector (como Quartz, Struts), lo que eventualmente provoca pérdidas de memoria.

​ En mi experiencia laboral anterior, he visto muchas veces que IntrospectorCleanupListener está configurado como un no-primer oyente en web.xml. La declaración oficial es que este oyente debe configurarse como el primer oyente en web.xml para que pueda desempeñar el papel más eficaz en el momento adecuado. La razón es realmente muy simple: antes de la especificación Servlet3.0, la llamada del oyente era aleatoria. A partir de Servlet3.0, el orden de las llamadas del oyente se basa en el orden configurado en web.xml, y el oyente de ServletContextListener está implementado. , el orden de llamada del método contextInitialized se ejecuta en orden positivo de acuerdo con el orden configurado en web.xml, mientras que el orden de llamada del método contextDestroyed se ejecuta en orden inverso de acuerdo con el orden configurado en web. .xml. Por lo tanto, si Introspector-CleanupListener está configurado como el primer oyente, entonces su método contextDestroyed se ejecutará en último lugar y tendrá el efecto de limpieza más efectivo; de lo contrario, es posible que haya caché que no se haya borrado.

4. Escucha de eventos web en Servlet API

4.1 ServletContextListener: monitorea la creación y destrucción de objetos servletContext

  • contextInitialized(ServletContextEvent arg0) – ejecutado cuando se crea
  • contextDestroyed(ServletContextEvent arg0) – ejecutado cuando se destruye

4.2 HttpSessionListener: monitorea la creación y destrucción de objetos de sesión

  • sessionCreated(HttpSessionEvent se) – ejecutado cuando se crea
  • sessionDestroyed(HttpSessionEvent se) – ejecutado cuando se destruye

4.3 ServletRequestListener: monitorea la creación y destrucción de objetos de solicitud

  • requestInitialized(ServletRequestEvent sre) – ejecutado cuando se crea
  • requestDestroyed(ServletRequestEvent sre) – ejecutado cuando se destruye

4.4 ServletContextAttributeListener: escucha cambios en los atributos del objeto servletContext

  • atributoAdded (evento ServletContextAttributeEvent): se ejecuta cuando se agrega un atributo
  • atributoReplaced (evento ServletContextAttributeEvent): se ejecuta cuando se modifica un atributo
  • atributoRemoved (evento ServletContextAttributeEvent): se ejecuta cuando se elimina un atributo

4.5 HttpSessionAttributeListener: escucha cambios en los atributos en el objeto de sesión

  • atributoAdded (evento HttpSessionBindingEvent): se ejecuta al agregar un atributo
  • atributoReplaced (evento HttpSessionBindingEvent): se ejecuta cuando se modifica un atributo
  • atributoRemoved (evento HttpSessionBindingEvent): se ejecuta cuando se elimina un atributo

4.6 ServletRequestAttributeListener: escucha cambios en los atributos en el objeto de solicitud

  • atributoAdded(ServletRequestAttributeEvent srae): ejecutado cuando se agrega un atributo
  • atributoReplaced(ServletRequestAttributeEvent srae) – ejecutado cuando se modifica un atributo
  • atributoRemoved(ServletRequestAttributeEvent srae): ejecutado cuando se elimina un atributo

Supongo que te gusta

Origin blog.csdn.net/songjianlong/article/details/132844675
Recomendado
Clasificación