美文网首页
springboot事件监听源码分析

springboot事件监听源码分析

作者: 圣村的希望 | 来源:发表于2018-03-24 16:26 被阅读0次

事件监听源码分析:

springboot程序是从main方法里面调用run方法启动程序的

run方法在启动的时候会先去创建一个SpringApplication实例,后再去执行run方法

实例化SpringApplication实例

设置上下文初始化实例以及设置事件监听器实例,其实这里在设置上下文初始化实例的时候已经去读取了spring.factories文件里面的配置,并放置到了SpringFactoriesLoader中的cache属性中

执行SpringApplication的run方法

SpringApplication实例的run方法

这里主要查看SpringApplicationRunListenerslisteners = getRunListeners(args)这行代码,获取监听器

这里获取监听器工厂实例

Set names =new LinkedHashSet<>(

SpringFactoriesLoader.loadFactoryNames(type, classLoader));这里用set来防止类被重复加载

loadFactoryNames(type, classLoader)来获取类的全限定名称,为后续进行实例化。这里获取的就是之前读取spring.factories文件放到的cache中去拿,因为在spring.factories中根据类型SpringApplicationRunListener读取到的工厂类是EventPublishingRunListener(这是springboot统一处理事件的类)

List instances = createSpringFactoriesInstances(type, parameterTypes,classLoader, args, names);这里创建事件处理的工厂实例(EventPublishingRunListener实例)

EventPublishingRunListener的实例化:

EventPublishingRunListener的实例化

EventPublishingRunListener会去实例化SimpleApplicationEventMulticaster(整个框架通用的事件处理器),所有EventPublishingRunListener监听到的事件都会交给SimpleApplicationEventMulticaster去进行处理,application.getListeners()获取到从spring.factorie文件里面读取到的所有事件监听器(ConfigFileApplicationListener配置文件监听器)。

listeners.starting()这里就相当与触发一个ApplicationStartingEvent事件,然后EventPublishingRunListener去进行处理ApplicationStartingEvent事件,实际是交由SimpleApplicationEventMulticaster去处理。

EventPublishingRunListener的starting处理方法

然后是调用SimpleApplicationEventMulticaster的multicastEvent方法去进行处理

SimpleApplicationEventMulticaster的multicastEvent方法

根据事件类型来获取对应的事件处理器(这里对应的也就是ApplicaitonStartingEvent事件),这里是遍历所有的事件监听器(亦即是spring.factories文件里面读取的10个监听器),然后调用相应的事件监听器的supportEventType方法看当前的事件是不是支持对应的事件,遍历所有的事件监听器,然后获取任务执行框架来异步执行调用事件监听处理器invokeListener(listener, event)

listener.onApplicationEvent(event)这里开始调用事件监听器的onApplicationEvent方法,也即是我们实现ApplicationListener接口的onApplicationEvent方法。

相关文章

网友评论

      本文标题:springboot事件监听源码分析

      本文链接:https://www.haomeiwen.com/subject/cboalxtx.html