• 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,则可以用异常处理器来处理异常。
  • 相关阅读:
    分享:liblfds 6.1.0 发布,C 数据结构库
    strchr C++ Reference
    爱上MVC3系列~PartialView中的页面重定向
    基础才是重中之重~Conditional特性使代码根据条件在debug或者release模式中执行
    爱上MVC3系列~Html.BeginForm与Ajax.BeginForm
    爱上MVC3系列~Razor页面中的共享namespace不起作用了(解决自定义扩展方法不能识别的问题)
    爱上MVC3系列~RenderAction与RenderPartial及一个页面多个表单提交
    NHibernate Criteria中的And, Or
    poj 2528 Mayor's posters(线段树区点)
    探索iptables BPF模块的悲惨历程
  • 原文地址:https://www.cnblogs.com/bigshark/p/11331245.html
Copyright © 2020-2023  润新知