当前位置: 首页 > news >正文

SpringBoot-启动流程

创建SpringApplication

1. 保存了一些主要资源信息,primarySoruce

2. ClassUtils

  • 用此工具类判断应用类型,比如:响应式应用类型、原生servlet应用类型、NONE

3. bootstrappers

  • 初始启动引导器(List<Bootstrapper>)
  • 去spring.factories文件中找 org.springframework.boot.Bootstrapper

4. ApplicationContextInitializer

  • 应用上下文初始化器
  • 去spring.factories找 ApplicationContextInitializer

5. ApplicationListener

  • 应用监听器
  • 去spring.factories找 ApplicationListener

运行SpringApplication

1. StopWatch

  • 监听整个应用程序启动停止的监听器
  • 记录了应用的启动时间

2. 创建引导上下文(Context环境)createBootstrapContext()

  • 获取到所有之前的 bootstrappers 循环执行 intitialize() 来完成对引导启动器上下文环境设置

3. 让当前应用进入headless模式

  • java.awt.headless
  • 自力更生模式

4. 获取所有 RunListener(运行监听器)【为了方便所有Listener进行事件感知】

  • getSpringFactoriesInstances 去spring.factories找 SpringApplicationRunListener

5. 遍历 SpringApplicationRunListener 调用 starting 方法

6. 保存命令行参数ApplicationArguments

  • 例如:java -jar xx.jar --server.port=8888,server.prot=8888就会存入ApplicationArguments中

7. 准备环境 prepareEnvironment()

  • 返回或者创建基础环境信息对象。StandardServletEnvironment

  • 配置环境信息对象。读取所有的配置源的配置属性值

  • 绑定环境信息
  • 监听器调用 listener.environmentPrepared():通知所有的监听器当前环境准备完成

8. 创建IOC容器(createApplicationContext())

  • 根据项目类型(Servlet)创建容器
  • 当前会创建 AnnotationConfigServletWebServerApplicationContext

9. 准备ApplicationContext IOC容器的基本信息 prepareContext()

  • 保存环境信息
  • IOC容器的后置处理流程
  • 应用初始化器applyInitializers,遍历所有的 ApplicationContextInitializer ,调用 initialize()来对ioc容器进行初始化扩展功能

  • 遍历所有的 listener 调用 contextPrepared。EventPublishRunListenr;通知所有的监听器contextPrepared

  • 所有的监听器调用 contextLoaded

10. 刷新IOC容器refreshContext,创建容器中的所有组件

  • spring的核心方法,实际调用的是AbstractApplicationContext.refresh()方法

11. 容器刷新完成后工作afterRefresh

12. 所有监听器调用 listeners.started(context),通知所有的监听器 started

13. 调用所有runners;callRunners()

  • 获取容器中的 ApplicationRunner
  • 获取容器中的 CommandLineRunner
  • 合并所有runner并且按照@Order进行排序
  • 遍历所有的runner。调用 run 方法
  • 执行一次数据初始化操作等

13. 如果以上有异常,调用Listener 的 failed

14. 调用所有监听器的 running 方法 listeners.running(context),通知所有的监听器 running

15. running如果有问题,处理异常,Listener 参数传的是null,所以不会执行failed

自定义相关组件

  • 自定义组件
public class MyApplicationContextInitializer implements ApplicationContextInitializer {}public class MyApplicationListener implements ApplicationListener {}public class MyApplicationRunner implements ApplicationRunner {}public class MyCommandLineRunner implements CommandLineRunner {}public class MySpringApplicationRunListener implements SpringApplicationRunListener {}
  • META-INF\spring.factories
org.springframework.context.ApplicationContextInitializer=\com.my.boot.listener.MyApplicationContextInitializerorg.springframework.context.ApplicationListener=\com.my.boot.listener.MyApplicationListenerorg.springframework.boot.SpringApplicationRunListener=\com.my.boot.listener.MySpringApplicationRunListener
http://www.dtcms.com/a/565923.html

相关文章:

  • 余姚公司建设网站海东高端网站建设价格
  • C# OpencvSharp使用lpd_yunet进行车牌检测
  • 淘宝联盟登记新网站广州网站建设公司怎么选
  • 济南天桥区网站建设公司豪华大气的旅行社网站源码
  • 网络通信的奥秘:网络层ip与路由详解(四)
  • Spring 框架介绍
  • 物联网设备物理环境自适应监控与运维策略优化
  • Redis 简介与安装指南
  • 营销网站建设专业服务公司精准大数据营销公司
  • 同性做视频网站wordpress 制作支付页
  • 公司内部网站建设方案最简单的网站建设
  • Linux 系统的内存分布结构及其之间的关系(持续更新)
  • DeviceNet转ProfiNet边缘计算网关赋能:西门子 1200PLC 与库卡机器人通讯配置完整案例
  • 网络卡顿运维排查方案:从客户端到服务器的全链路处理
  • 成都网站seo公司网站优化报告
  • 聊城网站制作价格做名片的网站
  • 辽宁网站建设招标网站如何做百度推广方案
  • ECharts 实战:`connectNulls` 的妙用——绘制连续折线图并跳过 0 值节点
  • Mysql引擎
  • 报表类系统后端API设计思路
  • 谷歌的技术栈是什么?
  • Token 存储与安全防护
  • HAProxy 简介及配置
  • 电商系统网站建设网站客户端制作教程
  • 只会后端不会前端如何做网站免费wordpress页面编辑器
  • BIRGMA验厂要求
  • 铝电解电容器用阳极箔:市场格局、技术演进与未来趋势
  • linux服务-vsftpd搭建
  • SAP PP生产报废单功能分享
  • 汇川H5U+HMI仿真运行追飞剪程序