SpringBoot系列- 启动原理(下)
从上一篇文章《SpringBoot系列-启动原理(上)》中,介绍了SpringBoot应用启动的核心方法run()的整体情况。这篇文章来详细展开介绍。其中比较重要的方法会标记上***
1. createBootstrapContext
DefaultBootstrapContext bootstrapContext = createBootstrapContext();
1. SpringApplication#createBootstrapContext方法:
1 private DefaultBootstrapContext createBootstrapContext() { 2 DefaultBootstrapContext bootstrapContext = new DefaultBootstrapContext(); 3 this.bootstrapRegistryInitializers.forEach((initializer) -> initializer.initialize(bootstrapContext)); 4 return bootstrapContext; 5 }
DefaultBootstrapContext 是 Spring Boot 2.4 版本引入的,它是用来提供应用启动时的一些早期引导操作。它允许在创建 ApplicationContext 之前,提前加载和初始化某些关键组件或资源。这对于某些在启动时需要提前初始化的场景非常重要,例如:
- 配置属性源的初始化(如 Environment 配置)
- 提供一些应用启动时的依赖资源(如外部配置文件、网络服务的连接等)
2. bootstrapContext 与 applicationContext 的区别:
1) bootstrapContext
bootstrapContext 是在 applicationContext 之前的一个轻量级上下文,它不会管理 bean 的生命周期,也不会处理依赖注入等常规操作。它主要用于在应用上下文完全初始化前,提前处理一些启动相关的任务。
2) applicationContext
applicationContext 是完整的 Spring 容器,用于管理应用的 bean 生命周期、依赖注入、事件驱动等。
二、getRunListeners
从 spring.factories文件中加载 SpringApplicationRunListener 的接口实现类
SpringApplicationRunListeners listeners = this.getRunListeners(args);
SpringApplication#getRunListeners 方法:
1 private SpringApplicationRunListeners getRunListeners(String[] args) { 2 3 Class<?>[] types = new Class[]{SpringApplication.class, String[].class}; 4 5 // 通过该方法 getSpringFactoriesInstances 指定 SpringApplicationRunListener 类型来加载的 6 // 注意下参数 this 就是当前的 SpringApplication 对象,用于获取监听器集合 7 return new SpringApplicationRunListeners(logger, this.getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args), this.applicationStartup); 8 }
3. starting
listeners.starting(bootstrapContext, this.mainApplicationClass);
4. prepareEnvironment
5. printBanner
六、createApplicationContext
context = this.createApplicationContext();
根据应用程序的类型,创建相应的ApplicationContext实例
1. SpringApplication#createApplicationContext()
1 protected ConfigurableApplicationContext createApplicationContext() { 4 return this.applicationContextFactory.create(this.webApplicationType); 8 }
2. WebApplicationType 枚举类
1 public enum WebApplicationType { 2 NONE, 3 SERVLET, 4 REACTIVE; 5 //... 6 }
WebApplicationType 是 Spring Boot 中的一个枚举类,用于表示应用程序的类型,即 Spring Boot 应用程序的运行环境类型。这个枚举类在 Spring Boot 启动时用于确定应用程序是 Web 应用程序(如 MVC、WebFlux), 还是非 Web 应用程序(如命令行工具)。它主要有以下三种类型:
1) NONE: 非 Web 应用(CLI、批处理等)。这种类型的应用程序不需要嵌入式的 Web 服务器,如 Tomcat、Jetty、Undertow 等。
2) SERVLET: 基于 Servlet 的传统 Web 应用(如使用 Spring MVC)。此类型的应用程序需要嵌入式的 Web 服务器,并且支持 Spring MVC 来处理 HTTP 请求。
3) REACTIVE: 基于反应式编程模型的 Web 应用(如使用 Spring WebFlux)。
七、 prepareContext 准备应用上下文
this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
这一步主要是在容器刷新之前的准备动作。包含一个非常关键的操作:将启动类注入容器,为后续开启自动化配置奠定基础。
// 调用Spring的refresh方法
8. refreshContext
this.refreshContext(context);
9. afterRefresh
应用上下文刷新之后的事件的处理
public class SpringApplication {
public ConfigurableApplicationContext run(String... args) {
//...
this.afterRefresh(context, applicationArguments);
}
//扩展接口,设计模式中的模板方法,默认为空实现。
//如果有自定义需求,可以重写该方法。比如打印一些启动结束log,或者一些其它后置处理
protected void afterRefresh(ConfigurableApplicationContext context, ApplicationArguments args) {
}
}
标签:Web,SpringBoot,启动,Spring,bootstrapContext,应用程序,SpringApplication,原理 From: https://www.cnblogs.com/hld123/p/18399925