SpringBoot扩展接口- ApplicationListener 事件监听器

ApplicationListener监听器用来监听ApplicationEvent事件。

ApplicationListener 可以在Spring项目运行过程中,监听对应的事件,来完成相应的操作。

ApplicationListener接口

是Spring应用生命周期各个阶段的事件监听器,可以在任意一个阶段触发我们想要执行的操作
负责在每个阶段做做对应处理
比如
ApplicationEnvironmentPreparedEvent环境准备完成事件中加载配置文件属性到数据源中

在SpringBoot启动过程中,要自定义监听SpringBoot启动过程中的事件。

SpringBoot启动流程中用到了事件都是继承自 SpringApplicationEvent 类

1、ApplicationStartingEvent:  在Spring最开始启动的时候触发
  日志系统初始化,字符集初始化,消息转换器,类型转换器初始化。
2、ApplicationEnvironmentPreparedEvent:环境准备完成事件,在Spring已经准备好上下文但是上下文尚未创建的时候触发
  命令行参数,配置文件属性源加载到Environment
3、ApplicationPreparedEvent:上下文准备完成事件,刷新上下文之前触发 4、ApplicationStartedEvent:应用启动完成事件,在刷新上下文之后、调用application命令之前触发
  在这里bean定义加载,并实例化完成,已经注册到BeanFactory
5、ApplicationReadyEvent:在调用applicaiton命令之后触发 6、ApplicationFailedEvent:在启动Spring发生异常时触发

添加启动流程的事件监听器的常用方法有两种

1、在META-INF/spring.factories文件中设置监听器:

# Application Listeners
org.springframework.context.ApplicationListener=
org.springframework.boot.ClearCachesApplicationListener,
org.springframework.boot.builder.ParentContextCloserApplicationListener,

2、在启动类中,先调用SpringApplication构造方法,再将自定义监听器设置进去。

在SpringBoot启动过程中,上下文事件监听器的处理过程

prepareContext()方法中

listeners.contextLoaded(context);

执行这个代码时,会将SpringApplication中的 监听器列表复制到ApplicationContext的监听器列表中。

到 refreshContext()方法时,

initApplicationEventMulticaster();
registerListeners();

会初始化ApplicationContext的事件广播类,SimpleApplicationEventMulticaster

将ApplicationContext的 事件监听器列表, BeanFactory中的 ApplicationListener实现类的Bean定义名称都注册到事件广播器中。

启动过程的事件之外的事件(自定义)

自定义事件以及事件监听器的方法

除了上面两种方法外,

3、实现监听器类,定义为Bean类,可以被自动添加到列表中

SpringApplicationRunListener接口

SpringBoot中的事件广播是通过监听器SpringApplicationRunListener接口实现类EventPublishingRunListener来进行事件分发从而调用ApplicationListener监听器的

所以我们可以配置自定义的springboot的监听器

配置在META-INF/spring.factories文件中配置

# Run Listeners
org.springframework.boot.SpringApplicationRunListener=
org.springframework.boot.context.event.EventPublishingRunListener
作者:海绵般汲取
出处:https://www.cnblogs.com/gne-hwz/
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
原文地址:https://www.cnblogs.com/gne-hwz/p/15294532.html