SpringBoot源码解析-事件驱动注解@EventListener

整体处理流程

在BeanPostProcess中,根据所秒该类下面所有的@EventListener注解的方法,根据该注解方法生成对应的ApplicationListener并将这些ApplicationListener放在ApplicationContext中,触发事件则是调用ApplicationEventMulticaster里面的multicastEvent方法,根据事件类型在ApplicationContext中找到对应的ApplicationListener,然后通过反射机制调用这些方法。

代码流程解析

入口ContextNamespaceHandler

代码入口是在ContextNamespaceHandler.class下面

AnnotationConfigBeanDefinitionParser

在AnnotationConfigBeanDefinitionParser的parse方法里面调用AnnotationConfigUtils.registerAnnotationConfigProcessors。这个方法大家可以研究一下,像SpringDataJPA这类是用注解就可以实现的功能都是在这里完成切面编程的。

AnnotationConfigUtils

EventListenerMethodProcessor

在processBean方法里面扫描所有带有@EventListener注解的方法,根据这些方法创建ApplicationListener对象

EventListenerFactory

EventListenerFactory有两个实现类一个DefaultEventListenerFactory,一个TransactionalEventListenerFactory。这两个不同点在于

    DefaultEventListenerFactory是@EventListener注解的实现,我们入口走的就是这个 TransactionalEventListenerFactory这个是@TransactionalEventListener注解的实现,这个我们有缘再讲

DefaultEventListenerFactory

这个就是返回一个Adapter

ApplicationListenerMethodAdapter

根据注解的类,方法生成Adapter,当触发事件是调用该Adapter的onApplicationEvent方法。 事件触发的话是靠ApplicationEventMulticaster里面的multicastEvent方法,这个以后再讲

经验分享 程序员 微信小程序 职场和发展