1、由于监听器很好的体现了一个事件驱动编程的理念
事件驱动编程中核心对象:
1):事件源:谁发出事件通知,发出消息;也就是事件主体,比如按钮;
2):事件名称:发出什么样的通知的名称,比如鼠标到我头上了,我被别人点了一下;
3):事件响应函数:谁对这个这个事件感兴趣,当这个事件发生时要执行什么样的操作;
4):事件对象:一般来说,当事件发生时,会产生一个描述该事件的具体对象,包含事件相关信息
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
监听器也可以说是我们WEB中的一个组件。
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext(application),HttpSession和ServletRequest这三个作用域对象。
2、WEB中有哪些监听器
Web中的监听器都是来监听作用域对象
request,session,application(ServletContext)
在这里我们分成两类共6个,一类是作用域生命周期监听器,一类是作用域属性监听器。
下面,我们再来分别来介绍一下这两种监听器:
2.3.1 作用域生命周期监听器
作用域的生命周期监听器: 负责监听request,session,application的创建和销毁.
ServletRequestListener:
HttpSessionListener:
ServletContextListener: 监听系统启动时,直接编写初始化代码.
2.3.2 作用域属性监听器
作用域的属性监听器(添加/删除/替换属性):
ServletRequestAttributeListener:
HttpSessionAttributeListener:
ServletContextAttributeListener
2.4 创建与使用监听器
在这里,咱们以ServletContextListener 为例来实现一个监听器,其它的监听器的做法都是差不多的。
第一步:写一个普通的类,实现ServletContextListener接口
@WebListener()
public class HelloListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("启动。。。");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("OVER。。。");
}
}
①ContextLoaderListener使用
ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。
3、spring事件
spring事件(Application Event)为bean与bean之间的消息通信提供了支持。
Spring的ApplicationContext 提供了支持事件和代码中监听器的功能。
Spring 提供了以下5中标准的事件(均是ApplicationEvent子类):
上下文更新事件(ContextRefreshedEvent):该事件会在ApplicationContext被初始化或者更新时发布。也可以在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。
spring事件需要遵循如下流程:
1、自定义事件,继承ApplicationEvent
2、定义事件监听器,实现ApplicationListener
3、使用容器发布事件。(使用ApplicationContext的publishEvent方法来发布)
参考:https://blog.csdn.net/tuzongxun/article/details/53637159