整体处理流程
在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方法,这个以后再讲
|