目录
1、前期准备
2、创建和注册事件监听器
(1)EventListenerMethodProcessor.class
(2)SmartInitializingSingleton -> Spring的回调
3、发布事件
1、前期准备
Spring容器在启动的时候初始化EventListenerMethodProcessor和 DefaultEventListenerFactory,当Spring Bean 创建完成后,会调用EventListenerMethodProcessor的afterSingletonsInstantiated()方法,用于处理@EventListener注解(创建和注册事件监听器)
源码分析
this()->new AnnotatedBeanDefinitionReader(this);一直跟进去,其中在注册初始化类时,注册了EventListenerMethodProcessor.class 和 DefaultEventListenerFactory.class 这两个类
EventListenerMethodProcessor.class 用于解析@EventListener注解,DefaultEventListenerFactory.class 是创建事件监听器的工厂。
2、创建和注册事件监听器
(1)EventListenerMethodProcessor.class
EventListenerMethodProcessor.class是一个BeanFactory的后置处理器,类继承结构如下:
所以当执行 BeanFactory 后置处理器时,会调用 postProcessBeanFactory(),将 DefaultEventListenerFactory (实现了EventListenerFactory接口)添加到容器中。
另外,EventListenerMethodProcessor也实现了SmartInitializingSingleton接口 , 重写了 afterSingletonsInstantiated()方法。
(2)SmartInitializingSingleton -> Spring的回调
我们知道SmartInitializingSingleton接口是在所有的Bean实例化完成以后,Spring回调的方法。
refresh() -> finishBeanFactoryInitialization(beanFactory) -> beanFactory.preInstantiateSingletons()
在EventListenerMethodProcessor的afterSingletonsInstantiated()方法中,获取所有的 BeanFactory,找到其中标注了 @EventListener 的方法,利用反射和 DefaultEventListenerFactory 为其创建 ApplicationListener,并添加到事件派发器的列表中。
3、发布事件
基于@EventListener注解的,发布事件流程和基于接口的一样,唯一的区别在于,当调用 listener.onApplicationEvent(event) 时,基于注解的会走到 ApplicationListenerMethodAdapter实现类中 onApplicationEvent方法,基于注解的是反射调用,而基于接口的形式是直接调用实现类的onApplicationEvent()方法。



