Spring事件监听器源码
spring 自定义了继承 jdk 事件监听器的接口applicationlistener<e extends applicationevent> extends eventlistener
,用来监听 spring 应用程序中的事件;自定义了继承 jdk 事件对象的抽象类applicationevent extends eventobject
,用来表示 spring 应用程序中的事件类型。容器启动刷新过程中,可以定义事件监听器,来监听应用程序上下文事件applicationcontextevent extends applicationevent
,它有四个具体的实现类:contextstartedevent/contextrefreshedevent/contextstoppedevent/contextclosedevent
,分别表示容器启动/刷新/停止/关闭的事件。
通常有两种方式来实现 spring 中的事件监听:
1.实现 applicationlistener 接口
public class mylistener implements applicationlistener<applicationevent> { @override public void onapplicationevent(applicationevent event) { system.out.println("mylistener: " + event); } }
2.使用 @eventlistener 注解
public class myannotationlistener { @eventlistener(classes = applicationevent.class) public void listen(applicationevent event) { system.out.println("@eventlistener:" + event); } }
3.自定义发布事件
public class test { public static void main(string[] args) { annotationconfigapplicationcontext context = new annotationconfigapplicationcontext(test.class); // 发布事件 context.publishevent(new applicationevent("my event") {}); } }
原理
在 spring 容器启动,调用 refresh() 刷新的过程中,会初始化事件派发器,并注册事件监听器,最后通过事件派发器,将事件发布给自己的监听器。
1 初始化事件派发器
initapplicationeventmulticaster();
为容器中的 beanfactory 初始化一个事件派发器 (applicationeventmulticaster) :simpleapplicationeventmulticaster,并注册到 beanfactory,name 为 applicationeventmulticaster。
2 添加 applicationlistener 监听器
registerlisteners();
取出 beanfactory 中 applicationlistener 类型的事件监听器,全部添加到上面的事件派发器的缓存中。
3 添加 @eventlistener 监听器
finishbeanfactoryinitialization(beanfactory)
从 spring 后置处理器源码 可知,spring 初始化时会注册 eventlistenermethodprocessor 和 defaulteventlistenerfactory。
eventlistenermethodprocessor 实现了 eventlistenermethodprocessor,所以执行 beanfactory 后置处理器时,会调用 postprocessbeanfactory(),将 defaulteventlistenerfactory 添加到缓存中。
eventlistenermethodprocessor 实现了 smartinitializingsingleton,所以在初始化剩余的单例 bean 之后,会调用 aftersingletonsinstantiated(),获取所有的 beanfactory,找到其中标注了 @eventlistener 的方法,利用反射和 defaulteventlistenerfactory 为其创建 applicationlistener,并添加到事件派发器的缓存中。
4 发布事件
finishrefresh();
- 初始化生命周期处理器,注册到 beanfactory,name 为 lifecycleprocessor。
- 调用生命周期处理器的 onrefresh(),表示刷新状态。
- 发布上下文刷新事件。调用事件派发器的 multicastevent() 进行派发,最终,通过回调事件监听器的 onapplicationevent() 方法,来通知监听器。
异步派发和异常处理器
- 如果事件派发器设置了 executor,则可以进行异步多线程的事件派发。
- 如果事件派发器设置了 errorhandler,则可以用异常处理器来处理异常。
下一篇: python系列——文件操作的代码