传媒公司手机网站模板,石家庄企业建站哪家好,影视采集网站怎么做收录,小程序游戏排行榜2023ApplicationListener是spring boot应用启动时的事件监听器。监听的事件有#xff08;包括但不限于#xff09;#xff1a; #xff08;1#xff09;接下来#xff0c;我们先通过一个例子实现自定义ApplicationListener#xff1a; 监听器需要实现ApplicationListener包括但不限于 1接下来我们先通过一个例子实现自定义ApplicationListener 监听器需要实现ApplicationListenerT参数类型为ApplicationEvent表示监听所有事件当然也可以将参数类型设置为单独的事件下面这个只会接收ApplicationEnvironmentPreparedEvent事件 2定义了监听器后还需要配置一下让spring boot启动时加载它即配置context.listener.classes 3启动后可以看到监听器监听了如下事件 4源码分析我们来看看自定义的监听器是怎么工作的
ApplicationListener是采用观察者模式实现的我们的启动时入口是执行SpringApplication.run方法
如下两处代码分别是获取SpringApplicationRunListeners这个是各个事件的发布者和进行环境的准备 在环境准备好后发布ApplicationEnvironmentPreparedEvent事件 虽然这里listeners是容器类但默认只有一个EventPublishingRunListener我们看一下它是怎么发布事件的如下代码很明显进行了一个事件的广播但还没看到广播给谁继续往下 这里可以看到getApplicationListeners(event, type)就是根据事件类型获取需要广播的ApplicationListener 在调试状态下我们看一下getApplicationListeners(event, type)有哪些 发现只有6个ApplicationListener响应了ApplicationEnvironmentPreparedEvent事件而且没有我们自定义的ApplicationListener怎么回事呢
实际上我们的ApplicationListener是通过代理类执行的即上面的DelegatingApplicationListener我们可以看一下它怎么执行的 上面代码可以看到代理类也监听了所有的事件然后在ApplicationEnvironmentPreparedEvent事件时才初次响应并且通过getListeners获取所有代理的ApplicationListeners然后它自己实现了一个事件广播器然后把获取的ApplicationListeners通过到addApplicationListener加入到广播器中最后进行事件的广播转发。我们重点看一下getListeners看是如何获取到我们自定义的ApplicationListeners的 我们可以看到是通过我们配置的context.listener.classes获得类名然后通过反射实例化返回。
这样整个监听器的过程就完整了。我们注意到代理类是从ApplicationEnvironmentPreparedEvent开始响应的所以之前的事件我们自定义的ApplicationListener是无法监听的。实际上前面只有一个ApplicationStartingEvent此时应用才刚启动也没啥好监听的。如果需要监听所有的事件可以在自己在spring.factories配置 在resources下新建META-INF\spring.factoies然后和spring的监听器配置一样配置自己定义的监听器就可以啦