
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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2023年08月26日 09时39分54秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【java面试经(架构师&设计师)-第5课】JAVA基础之多线程(一)
2019-03-07
ACL访问控制列表和NAT网络地址转换
2019-03-07
边界网关协议-BGP
2019-03-07
Linux-基本命令2-1
2019-03-07
关于CSS
2019-03-07
CSS
2019-03-07
font-size
2019-03-07
对象解析
2019-03-07
跳出"低水平勤奋陷阱"
2019-03-07
CPU参数指标说明
2019-03-07
models.py相关API
2019-03-07
关于测试
2019-03-07
HTML5
2019-03-07
节点List相关操作
2019-03-07
命名空间
2019-03-07
读书笔记
2019-03-07
Unity中常用Time类详解
2019-03-07
Echoworx为电子邮件加密平台增加生物特征身份验证功能
2019-03-07
法拉第未来选择Velodyne作为旗舰超豪华电动车FF 91的独家激光雷达供应商
2019-03-07
获高瓴资本5.3亿美元融资,京东健康就能“高枕无忧”了?
2019-03-07