SpringBoot 启动流程

SpringBoot项目每次调用接口前都会先启动主启动类,主启动类启动后会进入 main 方法中,并在方法中由 SpringApplication 调用 run(),方法中形参传入当前类的 class 对象以及 main 方法的 args 参数。下一步进入 run() 中,在 run() 中还调用了另一个 run( )。

SpringBoot 启动程序执行 SpringApplication.run(),创建了一个 SpringApplication 对象并执行 run 方法。

一、SpringBoot Starter的工作原理

1️⃣Spring Boot 在启动时扫描项目所依赖的 JAR 包,寻找包含 spring.factories 文件的 JAR。
2️⃣根据 spring.factories 配置加载 AutoConfigure 类。
3️⃣根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context。

二、实例化 SpringApplication 时做了什么?

①推断 WebApplicationType,主要思想就是在当前的 classpath 下搜索特定的类。
②搜索 META-INF\spring.factories 文件配置的 ApplicationContextInitializer 的实现类。
③搜索 META-INF\spring.factories 文件配置的 ApplicationListenerr 的实现类。
④推断 MainApplication 的 Class。

三、SpringApplication 的 run 方法做了什么?

1️⃣创建一个 StopWatch 并执行 start 方法,这个类主要记录任务的执行时间。
2️⃣配置 Headless 属性,Headless 模式是在缺少显示屏、键盘或者鼠标时候的系统配置。
3️⃣在文件 META-INF\spring.factories 中获取 SpringApplicationRunListener 接口的实现类 EventPublishingRunListener,主要发布 SpringApplicationEvent。
4️⃣把输入参数转成 DefaultApplicationArguments 类。
5️⃣创建Environment并设置比如环境信息,系统熟悉,输入参数和profile信息。
6️⃣打印Banner信息
7️⃣创建 Application 的上下文,根据 WebApplicationTyp 来创建 Context 类,如果非web项目则创建 AnnotationConfigApplicationContext,在构造方法中初始化 AnnotatedBeanDefinitionReader 和 ClassPathBeanDefinitionScanner。
8️⃣在文件 META-INF\spring.factories 中获取 SpringBootExceptionReporter 接口的实现类 FailureAnalyzers。
9️⃣准备 application 的上下文:
①初始化 ApplicationContextInitializer。
②执行 Initializer 的 contextPrepared 方法,发布 ApplicationContextInitializedEvent 事件。
③如果延迟加载,在上下文添加处理器 LazyInitializationBeanFactoryPostProcessor。
④执行加载方法,BeanDefinitionLoader.load 方法,主要初始化了AnnotatedGenericBeanDefinition。
⑤执行 Initializer 的 contextLoaded 方法,发布 ApplicationContextInitializedEvent 事件。
🔟刷新上下文,在这里真正加载bean到容器中。如果是web容器,会在onRefresh方法中创建一个Server并启动。

回到 run 方法,最后的逻辑就是发布启动完成的事件,并调用监听者的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值