写文章只是个人为了加强理解,留下点记录,方便后续查找复习。因能力有限,文中如有错误之处,还请留言指正,或者加个关注,互相学习,谢谢
一.Listener监听器(三者中相对简单的就是监听器,以spring事件监听为例讲解)

1.主题(被观察者)
ApplicationContext,也即spring上下文
2.事件
Spring 提供5种标准的事件:
更新事件(ContextRefreshedEvent):ApplicationContext被初始化或者更新时发布,也可以在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件,容器被关闭时,其管理的所有单例Bean都被销毁。
请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。
3.广播者
ApplicationEventMulticaster,负责维护操作监听器集合(新增和删除监听者);根据主题的事件变化,发布事件(循环调用集合中的监听器方法)
4.监听者(观察者)
监听者都要注册到ApplicationEventMulticaster广播者集合中,实现统一的接口ApplicationListener##onApplicationEvent方法,注意,观察者和被观察者未完全解耦
二.Filter(过滤器)
javax.servlet.Filter(servlet包下面的,说明它是servlet规范中的类,而servlet是用来处理网络请求的一套规范,所以过滤器依赖servlet)


ApplicationFilterChain(过滤器链)
1.ApplicationFilterChain类似于监听器中的广播者,维护一个过滤器集合
2.循环过滤器执行过滤动作,只不过,这里的集合有严格的顺序,内部其实是一个filters数组,形成一个完整的调用链,并不是链表结构(有头和尾的指针)
3.过滤器和监听器很像,都是维护一个集合,然后串行方法调用,注意,如果中间有一个短路/超时操作,都会影响全局
三.Interceptor拦截器(三者中比较复杂的)

1.拦截器和过滤器一样,有个集合来维护,调用会形成调用链,和过滤器不同的是,拦截器有两个实现方法pre、after,而过滤器只有一个doFilter方法
2.拦截器是基于java的反射机制调用的,而过滤器是基于函数回调
3.拦截器不依赖与servlet容器,而过滤器强依赖servlet容器
4.拦截器覆盖controller,而过滤器覆盖servlet
