事件监听源码分析:
springboot程序是从main方法里面调用run方法启动程序的
![](https://img.haomeiwen.com/i7277612/87fc8d1b83c53492.png)
实例化SpringApplication实例
![](https://img.haomeiwen.com/i7277612/8f9c0cc05f96c7d7.png)
执行SpringApplication的run方法
![](https://img.haomeiwen.com/i7277612/2ab10d33bdb83d70.png)
这里主要查看SpringApplicationRunListenerslisteners = getRunListeners(args)这行代码,获取监听器
![](https://img.haomeiwen.com/i7277612/b845867f3c9147af.png)
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的实例化:
![](https://img.haomeiwen.com/i7277612/ede69b825ea5c6fa.png)
EventPublishingRunListener会去实例化SimpleApplicationEventMulticaster(整个框架通用的事件处理器),所有EventPublishingRunListener监听到的事件都会交给SimpleApplicationEventMulticaster去进行处理,application.getListeners()获取到从spring.factorie文件里面读取到的所有事件监听器(ConfigFileApplicationListener配置文件监听器)。
listeners.starting()这里就相当与触发一个ApplicationStartingEvent事件,然后EventPublishingRunListener去进行处理ApplicationStartingEvent事件,实际是交由SimpleApplicationEventMulticaster去处理。
![](https://img.haomeiwen.com/i7277612/fa11b4b50d250c9e.png)
然后是调用SimpleApplicationEventMulticaster的multicastEvent方法去进行处理
![](https://img.haomeiwen.com/i7277612/5eddf360353c151e.png)
根据事件类型来获取对应的事件处理器(这里对应的也就是ApplicaitonStartingEvent事件),这里是遍历所有的事件监听器(亦即是spring.factories文件里面读取的10个监听器),然后调用相应的事件监听器的supportEventType方法看当前的事件是不是支持对应的事件,遍历所有的事件监听器,然后获取任务执行框架来异步执行调用事件监听处理器invokeListener(listener, event)
![](https://img.haomeiwen.com/i7277612/9c42837caee5a3d3.png)
![](https://img.haomeiwen.com/i7277612/4c6c79feb66f023c.png)
listener.onApplicationEvent(event)这里开始调用事件监听器的onApplicationEvent方法,也即是我们实现ApplicationListener接口的onApplicationEvent方法。
网友评论