【Spring Boot系列】- Spring Boot侦听器Listener

news/2025/1/12 8:48:55/

【Spring Boot系列】- Spring Boot侦听器Listener

文章目录

  • 【Spring Boot系列】- Spring Boot侦听器Listener
    • 一、概述
    • 二、监听器Listener分类
      • 2.1 监听ServletContext的事件监听器
      • 2.2 监听HttpSeesion的事件监听器
      • 2.3 监听ServletRequest的事件监听器
    • 三、SpringMVC中的监听器
      • 3.1 ContextLoaderListener
      • 3.2 RequestContextListen
        • Request作用域
        • Session作用域
        • global session作用域
      • 3.3 IntrospectorCleanupListener
        • Introspector作用及影响
        • 配置IntrospectorCleanupListener
      • 四、Servlet API中Web事件监听器
      • 4.1 ServletContextListener -- 监听servletContext对象的创建以及销毁
      • 4.2 HttpSessionListener -- 监听session对象的创建以及销毁
      • 4.3 ServletRequestListener -- 监听request对象的创建以及销毁
      • 4.4 ServletContextAttributeListener -- 监听servletContext对象中属性的改变
      • 4.5 HttpSessionAttributeListener --监听session对象中属性的改变
      • 4.6 ServletRequestAttributeListener --监听request对象中属性的改变

在这里插入图片描述

一、概述

什么事Web监听器?web监听器就是Servlet中特殊的类,他们能帮助开发者监听web中的特定事件,比如ServletContext、HttpSession、ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控等等。web监听器的使用场景有很多;Spring的监听器是一种观察者模式,它能实现事件与事件监听者直接的解耦;

二、监听器Listener分类

2.1 监听ServletContext的事件监听器

分别为:ServletContextListener、ServletContextAttributeListener。Application级别,整个应用只存在一个,可以进行全局配置。

2.2 监听HttpSeesion的事件监听器

分别为:HttpSessionListener、HttpSessionAttributeListener。Session级别,针对每一个对象,如统计会话总数。

2.3 监听ServletRequest的事件监听器

分别为:ServletRequestListener、ServletRequestAttributeListener。Request级别,针对每一个客户请求。

三、SpringMVC中的监听器

3.1 ContextLoaderListener

在启动Web容器时,自动装配Spring applicationContext.xml的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。

以下是web.xml中ContextLoaderListener的配置和context的配置

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

context-param

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

ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

3.2 RequestContextListen

基于LocalThread将HTTP request对象绑定到为该请求提供服务的线程上。这使得具有request和session作用域的bean能够在后面的调用链中被访问到。

  • Request作用域

<bean id="loginAction" class="com.goyeer.LoginAction" scope="request"/>  

针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

  • Session作用域

<bean id="user" class="com.goyeer.User" scope="session"/>

针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

  • global session作用域

<bean id="userPrefere" class="com.goyeer.userPrefere" scope="globalSession"/> 

global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。 请注意,假如你在编写一个标准的基于Servlet的web应用,并且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。

3.3 IntrospectorCleanupListener

  • Introspector作用及影响

在分析IntrospectorCleanupListener之前,先了解一下Introspector。Introspector是JDK中java.beans包下的类,它为目标JavaBean提供了一种了解原类方法、属性和事件的标准方法。通俗的说,就是可以通过Introspector构建一个BeanInfo对象,而这个BeanInfo对象中包含了目标类中的属性、方法和事件的描述信息,然后可以使用这个BeanInfo对象对目标对象进行相关操作。

Introspector间接持有了BeanInfo的强引用。如果使用Introspector操作了很多类,那么Introspector将间接持有这些BeanInfo的强引用。在发生垃圾收集的时候,检测到这些BeanInfo存在引用链,则这些类和对应的类加载器将不会被垃圾收集器回收,进而导致内存泄漏。所以,为了解决这个问题,在使用Introspector操作完成后,调用Introspector类的flushCaches方法清除缓存。

  • 配置IntrospectorCleanupListener

此监听器主要用于解决java.beans.Introspector导致的内存泄漏的问题。JDK中的java.beans.Introspector类的用途是发现Java类是否符合JavaBean规范。如果有的框架或程序用到了Introspector类,那么就会启用一个系统级别的缓存,此缓存会存放一些曾加载并分析过的JavaBean的引用。当Web服务器关闭时,由于此缓存中存放着这些JavaBean的引用,所以垃圾回收器无法回收Web容器中的JavaBean对象,最后导致内存变大。而org.springframework.web.util.IntrospectorCleanupListener就是专门用来处理Introspector内存泄漏问题的辅助类。IntrospectorCleanupListener会在Web服务器停止时清理Introspector缓存,使那些Javabean能被垃圾回收器正确回收。Spring自身不会出现这种问题,因为Spring在加载并分析完一个类之后会马上刷新。java.beans.-Introspector缓存,这就保证Spring中不会出现这种内存泄漏的问题。但有些程序和框架在使用了JavaBeans Introspector之后,没有进行清理工作(如Quartz,Struts),最后导致内存泄漏。

​ 在以往的工作经历中,多次看到在web.xml中将IntrospectorCleanupListener配置成非第一个listener。官方的表述是必须将此监听器配置成web.xml中的第一个listener,才能在合适的时间发挥最有效的作用。原因其实很简单,在Servlet3.0规范之前,监听器的调用是随机的,而从Servlet3.0开始,监听器的调用顺序是根据其在web.xml中配置的顺序,并且实现ServletContextListener的监听器,contextInitialized方法调用顺序是按照在web.xml中配置的顺序正序依次执行,而contextDestroyed方法的调用顺序是按照在web.xml中配置的顺序逆序依次执行。所以,如果Introspector-CleanupListener被配置成了第一个listener,那么它的contextDestroyed方法将最后一个执行,将发挥最有效的清除作用;而如果不是,那么可能会残留未被清除的缓存。

四、Servlet API中Web事件监听器

4.1 ServletContextListener – 监听servletContext对象的创建以及销毁

  • contextInitialized(ServletContextEvent arg0) – 创建时执行
  • contextDestroyed(ServletContextEvent arg0) – 销毁时执行

4.2 HttpSessionListener – 监听session对象的创建以及销毁

  • sessionCreated(HttpSessionEvent se) – 创建时执行
  • sessionDestroyed(HttpSessionEvent se) – 销毁时执行

4.3 ServletRequestListener – 监听request对象的创建以及销毁

  • requestInitialized(ServletRequestEvent sre) – 创建时执行
  • requestDestroyed(ServletRequestEvent sre) – 销毁时执行

4.4 ServletContextAttributeListener – 监听servletContext对象中属性的改变

  • attributeAdded(ServletContextAttributeEvent event) – 添加属性时执行
  • attributeReplaced(ServletContextAttributeEvent event) – 修改属性时执行
  • attributeRemoved(ServletContextAttributeEvent event) – 删除属性时执行

4.5 HttpSessionAttributeListener --监听session对象中属性的改变

  • attributeAdded(HttpSessionBindingEvent event) – 添加属性时执行
  • attributeReplaced(HttpSessionBindingEvent event) – 修改属性时执行
  • attributeRemoved(HttpSessionBindingEvent event) – 删除属性时执行

4.6 ServletRequestAttributeListener --监听request对象中属性的改变

  • attributeAdded(ServletRequestAttributeEvent srae) – 添加属性时执行
  • attributeReplaced(ServletRequestAttributeEvent srae) – 修改属性时执行
  • attributeRemoved(ServletRequestAttributeEvent srae) – 删除属性时执行

http://www.ppmy.cn/news/1107838.html

相关文章

敲代码常用快捷键

1、代码拖动 PyCharm&#xff1a;按住 shiftalt鼠标选中某一区域来拖动&#xff0c;即可实现拖动这一区域至指定区域。Visual Studio Code (VSCode): - Windows/Linux&#xff1a;Alt 鼠标左键拖动 - MacOS&#xff1a;Option 鼠标左键拖动 IntelliJ IDEA: - Win…

【C语言】字符串函数

文章目录 前言1.strcat2.strncpy3.strncat4.strncmp5.strstr6.strtok7.strerror8.strcat的模拟实现9.strstr的模拟实现 总结 添加链接描述 前言 大家好呀&#xff0c;今天给大家分享一下字符函数和字符串函数C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没…

故障治理:如何进行故障复盘

故障复盘的重要性无需多说&#xff0c;每一次故障都是宝贵的学习机会&#xff0c;本人接手故障复盘工作已经半年有余&#xff0c;从一开始的手足无措&#xff0c;慢慢变得游刃有余。以下内容为本人从网上查阅学习多个专家经验&#xff0c;并结合工作经历总结而来&#xff0c;仅…

【漏洞复现】泛微e-office OfficeServer2.php 存在任意文件读取漏洞复现

文章目录 前言声明一、漏洞描述二、漏洞分析三、漏洞复现四、修复建议前言 泛微e-office OfficeServer2.php 存在任意文件读取漏洞,攻击者可通过构造特定Payload获取敏感数据信息。 声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造…

记录一次对登录接口的性能测试

测试环境 客户端: win10 这里可以用linux,但没用,因为想直观查看结果。 被测环境:linux X86 4核CPU16G内存 被测接口:登录接口,没有做数据驱动。 场景设计 设置线程数19,持续时间5分钟,并用后端监听器监听结果,使用grafana+prometheus监控服务器资源。 测试执行 …

jeesite实现excel导入功能(保姆级图文教程)

文章目录 前言一、准备工作1.准备一个excel模板,放入static目录2.application.yml文件中设置文件存储路径3.使用easyexcel插件解析excel数据,pom文件导入easyexcel二、使用步骤1.列表页添加下载模板按钮2.表单页添加文件上传3. 创建excel解析对应实体4.后台完成文件上传代码,…

android 在后台任务栏隐藏应用程序

android:launchMode"singleInstance"android:excludeFromRecents"true" 使用android:excludeFromRecents"true"属性来隐藏应用程序的任务条目&#xff0c;即在最近使用的应用程序列表中不显示应用程序的图标,需要配合android:launchMode"s…

【Linux从入门到精通】信号(信号保存 信号的处理)

本篇文章接着信号&#xff08;初识信号 & 信号的产生&#xff09;进行讲解。学完信号的产生后&#xff0c;我们也了解了信号的一些结论。同时还留下了很多疑问&#xff1a; 上篇文章所说的所有信号产生&#xff0c;最终都要有OS来进行执行&#xff0c;为什么呢&#xff1f;…