当前位置: 移动技术网 > IT编程>开发语言>Java > Spring事件监听器源码

Spring事件监听器源码

2019年08月11日  | 移动技术网IT编程  | 我要评论

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();

  1. 初始化生命周期处理器,注册到 beanfactory,name 为 lifecycleprocessor。
  2. 调用生命周期处理器的 onrefresh(),表示刷新状态。
  3. 发布上下文刷新事件。调用事件派发器的 multicastevent() 进行派发,最终,通过回调事件监听器的 onapplicationevent() 方法,来通知监听器。

异步派发和异常处理器

  • 如果事件派发器设置了 executor,则可以进行异步多线程的事件派发。
  • 如果事件派发器设置了 errorhandler,则可以用异常处理器来处理异常。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网