欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring事件监听器源码

程序员文章站 2023-01-01 15:45:01
Spring 自定义了继承 JDK 事件监听器的接口 ,用来监听 Spring 应用程序中的事件;自定义了继承 JDK 事件对象的抽象类 ,用来表示 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();

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

异步派发和异常处理器

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