事件监听源码分析:
springboot程序是从main方法里面调用run方法启动程序的

实例化SpringApplication实例

执行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会去实例化SimpleApplicationEventMulticaster(整个框架通用的事件处理器),所有EventPublishingRunListener监听到的事件都会交给SimpleApplicationEventMulticaster去进行处理,application.getListeners()获取到从spring.factorie文件里面读取到的所有事件监听器(ConfigFileApplicationListener配置文件监听器)。
listeners.starting()这里就相当与触发一个ApplicationStartingEvent事件,然后EventPublishingRunListener去进行处理ApplicationStartingEvent事件,实际是交由SimpleApplicationEventMulticaster去处理。

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

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


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