
0关注
552
文章
0
收藏
2
次赞
281266
查看
Ta的博客 更多
SpringBoot 五种获取ApplicationContext的方式java中进行日期时间比较的4种方法SpringBoot整合WebSocket实现前后端互推消息CSS怎么画五角星?SpringBoot中RedisUtils工具类配置及直接使用SpringBoot核心机制三、ApplicationListener
SpringBoot核心机制三、ApplicationListener
所有调试均使用SpringBoot 2.4.5版本。ApplicationListener事件监听机制其实是由Spring提供的,应用内部的事件驱动机制。也就是Pub/Sub发布订阅机制在应用内部的实现。一般主要是用于监控应用内部的一些运行状况,在应用开发中也可以使用。
具体的实现机制可以到Spring中去探究,这里就来简单理解下SpringBoot对这个事件驱动机制做了哪些封装。
所有调试均使用SpringBoot 2.4.5版本。
ApplicationListener事件监听机制其实是由Spring提供的,应用内部的事件驱动机制。也就是Pub/Sub发布订阅机制在应用内部的实现。一般主要是用于监控应用内部的一些运行状况,在应用开发中也可以使用。
具体的实现机制可以到Spring中去探究,这里就来简单理解下SpringBoot对这个事件驱动机制做了哪些封装。
一、事件监听器使用
1、自己实现一个事件监听器
然后还是在项目的spring.factories中配置监听器然后配置启动类。在启动类中发布一个自己的事件。正常启动SpringBoot应用,就能打印出启动过程中的关键事件的日志。这里把关键的事件日志给整理出来:
这里就打印出了SpringBoot应用启动过程中的多个内部事件。实际上这多个内部事件也就对应了启动过程的各个阶段,是梳理SpringBoot启动流程非常好的入口。
Spring事件机制的其他细节这里就不多说了,大家可以自行了解。我们这里还是专注于SpringBoot的部分。
然后还是在项目的spring.factories中配置监听器
然后配置启动类。在启动类中发布一个自己的事件。
正常启动SpringBoot应用,就能打印出启动过程中的关键事件的日志。这里把关键的事件日志给整理出来:
这里就打印出了SpringBoot应用启动过程中的多个内部事件。实际上这多个内部事件也就对应了启动过程的各个阶段,是梳理SpringBoot启动流程非常好的入口。
Spring事件机制的其他细节这里就不多说了,大家可以自行了解。我们这里还是专注于SpringBoot的部分。
2、事件监听器的其他配置方式:
2.1 SpringApplication.addListener
2.2 基于注解添加
2.3 在SpringBoot的配置文件中配置
context.listener.classes=com.roy.applicationListener.MyApplicationListener这几种方式都可以配置事件监听器。另外,其实在上一章节ApplicationContextInitializer中也能看到,在SpringBoot内部也在应用初始化中扩展出了很多通过application添加事件监听器的扩展。
context.listener.classes=com.roy.applicationListener.MyApplicationListener
这几种方式都可以配置事件监听器。另外,其实在上一章节ApplicationContextInitializer中也能看到,在SpringBoot内部也在应用初始化中扩展出了很多通过application添加事件监听器的扩展。
二、核心机制解读
SpringBoot中对于监听器的处理,也跟ApplicationContextInitializer的处理流程是差不多的。首先在SpringApplication的构造方法中加载所有的监听器:然后在SpringApplication的run方法中启动所有监听器:首先在注册SpringApplicationRunListener时,就会解析spring.factories,读取其中的org.springframework.boot.SpringApplicationRunListener配置。然后从发布事件的地方往下调试,可以看到SpringBoot事件发布的核心对象EventPublishingRunListener。通过其中的initialMulticaster组件来发布不同的事件。 而他实现事件监听的方式就是在发布事件时,实时调用一下已经注册的所有对应事件的监听器。调用Spring中的SimpleApplicationEventMulticaster组件发布事件。这其中initialMulticaster对象已经是Spring-Context包中的内容。所以这里就完成了SpringBoot中事务监听机制的梳理。
这个事件机制也是SpringBoot使用过程中非常好的功能扩展点,因为应用启动过程中,这些事件都已经默认发布了,可以叠加自己想要的应用初始化工作。这些关键事件的发布顺序也是非常重要的。例如,如果你的扩展功能需要用到Spring的IOC容器,那就只能去监听ContextRefreshedEvent之后的几个内部事件。
SpringBoot中对于监听器的处理,也跟ApplicationContextInitializer的处理流程是差不多的。首先在SpringApplication的构造方法中加载所有的监听器:
然后在SpringApplication的run方法中启动所有监听器:
首先在注册SpringApplicationRunListener时,就会解析spring.factories,读取其中的org.springframework.boot.SpringApplicationRunListener配置。
然后从发布事件的地方往下调试,可以看到SpringBoot事件发布的核心对象EventPublishingRunListener。通过其中的initialMulticaster组件来发布不同的事件。 而他实现事件监听的方式就是在发布事件时,实时调用一下已经注册的所有对应事件的监听器。
调用Spring中的SimpleApplicationEventMulticaster组件发布事件。
这其中initialMulticaster对象已经是Spring-Context包中的内容。所以这里就完成了SpringBoot中事务监听机制的梳理。
这个事件机制也是SpringBoot使用过程中非常好的功能扩展点,因为应用启动过程中,这些事件都已经默认发布了,可以叠加自己想要的应用初始化工作。这些关键事件的发布顺序也是非常重要的。例如,如果你的扩展功能需要用到Spring的IOC容器,那就只能去监听ContextRefreshedEvent之后的几个内部事件。
三、SpringBoot中的核心实现
接下来其他几个事件监听器的功能也简单总结下。有兴趣的建议自行调试下代码,这样才能形成自己的理解。
- org.sf.boot.ClearCachesApplicationListener:应用上下文加载完成后对缓存做清除工作,响应事件ContextRefreshedEvent
- org.sf.boot.builder.ParentContextCloserApplicationListener:监听双亲应用上下文的关闭事件并往自己的孩子应用上下文中传播,相关事件ParentContextAvailableEvent/ContextClosedEvent
- org.sf.boot.context.FileEncodingApplicationListener:如果系统文件编码和环境变量中指定的不同则终止应用启动。
- 具体的方法是比较系统属性file.encoding和环境变量spring.mandatory-file-encoding是否相等(大小写不敏感)。
- org.sf.boot.context.config.AnsiOutputApplicationListener:根据spring.output.ansi.enabled参数配置AnsiOutput
- org.sf.boot.context.config.DelegatingApplicationListener:监听到事件后转发给环境变量context.listener.classes指定的那些事件监听器
- org.sf.boot.context.logging.LoggingApplicationListener 配置LoggingSystem。使用logging.config环境变量指定的配置或者缺省配置
- org.springframework.boot.env.EnvironmentPostProcessorApplicationListener: 加载spring.factories文件中配置的EnvironmentPostProcessor。
- org.sf.boot.liquibase.LiquibaseServiceLocatorApplicationListener 使用一个可以和Spring Boot可执行jar包配合工作的版本替换liquibase ServiceLocator
接下来其他几个事件监听器的功能也简单总结下。有兴趣的建议自行调试下代码,这样才能形成自己的理解。
- org.sf.boot.ClearCachesApplicationListener:应用上下文加载完成后对缓存做清除工作,响应事件ContextRefreshedEvent
- org.sf.boot.builder.ParentContextCloserApplicationListener:监听双亲应用上下文的关闭事件并往自己的孩子应用上下文中传播,相关事件ParentContextAvailableEvent/ContextClosedEvent
- org.sf.boot.context.FileEncodingApplicationListener:如果系统文件编码和环境变量中指定的不同则终止应用启动。
- 具体的方法是比较系统属性file.encoding和环境变量spring.mandatory-file-encoding是否相等(大小写不敏感)。
- org.sf.boot.context.config.AnsiOutputApplicationListener:根据spring.output.ansi.enabled参数配置AnsiOutput
- org.sf.boot.context.config.DelegatingApplicationListener:监听到事件后转发给环境变量context.listener.classes指定的那些事件监听器
- org.sf.boot.context.logging.LoggingApplicationListener 配置LoggingSystem。使用logging.config环境变量指定的配置或者缺省配置
- org.springframework.boot.env.EnvironmentPostProcessorApplicationListener: 加载spring.factories文件中配置的EnvironmentPostProcessor。
- org.sf.boot.liquibase.LiquibaseServiceLocatorApplicationListener 使用一个可以和Spring Boot可执行jar包配合工作的版本替换liquibase ServiceLocator
0 0