SpringBoot启动过程深度解析——SpringApplicationEvent事件发布-启动过程解析&常见实现类
发布日期:2023-09-20 01:39:16 浏览次数:1 分类:技术文章

本文共 5214 字,大约阅读时间需要 17 分钟。

SpringBoot启动过程深度解析——SpringApplicationEvent事件发布


文章使用 spring 相关版本信息:

spring-boot 2.3.4.RELEASE
spring-core 5.2.9.RELEASE
spring-context 5.2.9.RELEASE
spring-web 5.2.9.RELEASE


接下来的文章就以SpringApplication.run的启动方式讲解

@SpringBootApplicationpublic class Main {
public static void main(String[] args) {
new SpringApplication(Main.class).run(); }}

springBoot启动过程事件发布的时间线【未完待续…】

ApplicationStartingEventApplicationEnvironmentPreparedEvent ApplicationContextInitializedEventApplicationPreparedEventApplicationStartedEventApplicationReadyEventApplicationFailedEvent1.   准备好前期的一些简单设置2. 【发布】SpringApplication.run() --> ApplicationStartingEvent3.   生成了环境对象(系统变量,项目环境文件)4. 【发布】 SpringApplication.run() --> ApplicationEnvironmentPreparedEvent 5.   Context上下文已经初始化(执行了ApplicationContextInitializer)6. 【发布】SpringApplication.run().prepareContext() -> ApplicationContextInitializedEvent7.   Context加载BeanDefinition(自动装配完成)8. 【发布】SpringApplication.run().prepareContext() ->  ApplicationPreparedEvent9.   执行Spring的refresh的标准化流程10.【发布】SpringApplication.run() ->  ApplicationStartedEvent10.  遍历执行ApplicationRunner的run方法12.【发布】SpringApplication.run() ->  ApplicationReadyEvent11.  SpringApplication.run()启动异常捕获14.【发布】SpringApplication.run() ->  ApplicationFailedEvent

springBoot启动过程的监听器

事件:ApplicationStartingEvent	监听器:		BackgroundPreinitializer:创建上下文Context一些比较耗时的属性对象(ConversionService、MessageConverter、Jackson、Charset、Validation)		LoggingApplicationListener:根据classloader加载日志模块,哪个加载成功,就使用哪个,执行具体的logging组件的回调方法【只是加载,和执行对调方法】		LiquibaseServiceLocatorApplicationListener:设置Liqui的customResolverServiceLocator(Liquibase:对数据库结构进行管理的插件)事件:ApplicationEnvironmentPreparedEvent	监听器:		ApplicationPidFileWriter:尝试获取PID,并且保持到指定文件中			FileEncodingApplicationListener:系统文件编码与环境中设置的预期值不匹配,则停止应用程序启动		AnsiOutputApplicationListener:根据spring.output.ansi.enabled参数配置AnsiOutput		ConfigFileApplicationListener:通过从已知文件位置加载属性来配置上下文环境。默认情况下,属性将从以下位置的“application.properties”和/或“application.yml”文件加载		DelegatingApplicationListener:context.listener.classes指定的那些事件监听器注册到多播器中,转发事件给context.listener.classes指定的那些事件监听器		ClasspathLoggingApplicationListener:打印classpath		WebEnvironmentPropertySourceInitializer:重新设置配置源的servletContext				事件:ApplicationContextInitializedEvent	监听器:		DelegatingApplicationListener:转发事件给context.listener.classes指定的那些事件监听器					事件:ApplicationPreparedEvent	监听器:		CloudFoundryVcapEnvironmentPostProcessor:更换自己类中logger的class		ApplicationPidFileWriter:尝试获取PID,并且保持到指定文件中		ConfigFileApplicationListener:向容器添加一个配置源排序的增强器PropertySourceOrderingPostProcessor implements BeanFactoryPostProcessor		ApplicationEnvironmentPreparedEvent:向Context注册Bean:日志系统(loggingSystem、logFile、loggerGroups)		DelegatingApplicationListener:转发事件给context.listener.classes指定的那些事件监听器	事件:ApplicationStartedEvent	监听器:		DelegatingApplicationListener:转发事件给context.listener.classes指定的那些事件监听器	事件:WebServerInitializedEvent	监听器:			SpringApplicationAdminMXBeanRegistrar:设置ready标志=true			事件:ApplicationReadyEvent	监听器:		BackgroundPreinitializer:如果ApplicationStartingEvent事件还没创建完对象,就阻塞主线程		SpringApplicationAdminMXBeanRegistrar:设置ready标志=true		DelegatingApplicationListener:转发事件给context.listener.classes指定的那些事件监听器		ApplicationPidFileWriter:尝试获取PID,并且保持到指定文件中		事件:ApplicationFailedEvent	监听器:		BackgroundPreinitializer:如果ApplicationStartingEvent事件还没创建完对象,就阻塞主线程		DelegatingApplicationListener:转发事件给context.listener.classes指定的那些事件监听器			ClasspathLoggingApplicationListener:打印classpath		LoggingApplicationListener:调用日志系统对应的cleanUp实现方法

springBoot启动过程监听器处理的内容

监听器:BackgroundPreinitializer	事件:ApplicationStartingEvent			创建一些比较耗时的对象			runSafely(new ConversionServiceInitializer());			runSafely(new ValidationInitializer());			runSafely(new MessageConverterInitializer());			runSafely(new JacksonInitializer());			runSafely(new CharsetInitializer());	事件:ApplicationReadyEvent			如果ApplicationStartingEvent事件还没创建完对象,就阻塞主线程	事件:ApplicationFailedEvent			如果ApplicationStartingEvent事件还没创建完对象,就阻塞主线程监听器:ApplicationPidFileWriter	事件:ApplicationEnvironmentPreparedEvent			尝试获取PID,并且保持到指定文件中	事件:ApplicationPreparedEvent			尝试获取PID,并且保持到指定文件中	事件:ApplicationReadyEvent			尝试获取PID,并且保持到指定文件中			监听器:FileEncodingApplicationListener	事件:ApplicationEnvironmentPreparedEvent			系统文件编码与环境中设置的预期值不匹配,则停止应用程序启动			监听器:ConfigFileApplicationListener	事件:ApplicationEnvironmentPreparedEvent			通过从已知文件位置加载属性来配置上下文环境。默认情况下,属性将从以下位置的“application.properties”和/或“application.yml”文件加载	事件:ApplicationPreparedEvent			向容器添加一个配置源排序的增强器PropertySourceOrderingPostProcessor implements BeanFactoryPostProcessor			监听器:DelegatingApplicationListener	事件:ApplicationEnvironmentPreparedEvent			context.listener.classes指定的那些事件监听器注册到多播器中,转发事件给context.listener.classes指定的那些事件监听器	其他事件:			转发事件给context.listener.classes指定的那些事件监听器			监听器:ClasspathLoggingApplicationListener	事件:ApplicationEnvironmentPreparedEvent			打印classpath	事件:ApplicationFailedEvent			打印classpath				监听器:LoggingApplicationListener	事件:ApplicationStartingEvent			根据classloader加载日志模块,哪个加载成功,就使用哪个,执行具体的logging组件的回调方法【只是加载,和执行对调方法】	事件:ApplicationEnvironmentPreparedEvent			根据配置创建对应的日志系统	事件:ApplicationPreparedEvent			向Context注册Bean:日志系统(loggingSystem、logFile、loggerGroups)	事件:ContextClosedEvent && 没有父容器			调用日志系统对应的cleanUp实现方法	事件:ApplicationFailedEvent			调用日志系统对应的cleanUp实现方法

转载地址:https://blog.csdn.net/weixin_39072857/article/details/129680018 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:SpringBoot启动过程深度解析——Spring声明式事务@Transactional启动过程与事务执行过程解析
下一篇:SpringBoot启动过程深度解析——Spring-Aop代理过程解析-jdk动态代理-cglib动态代理解析

发表评论

最新留言

不错!
[***.144.177.141]2023年08月26日 09时39分54秒