Skip to content

Springboot容器启动过程

Spring Boot 应用程序的启动过程是一个精心设计的流程,它自动化了传统 Spring 应用中繁琐的配置和启动步骤。整个过程的核心围绕 SpringApplication.run() 方法展开,该方法引导了 Spring 应用上下文(IoC 容器)的创建、配置和启动。

1. 启动入口:SpringApplication.run()

每个 Spring Boot 项目都有一个主启动类,其中包含一个 main 方法,该方法通常只有一行代码:SpringApplication.run(MyApplication.class, args);。 这行代码是整个启动流程的起点。

SpringApplication.run() 静态方法的执行主要分为两个阶段: * 创建 SpringApplication 实例:首先会创建一个 SpringApplication 类的对象。 * 调用实例的 run() 方法:然后利用创建的实例来调用其 run() 方法。

2. SpringApplication 对象的初始化

SpringApplication 的构造函数中,会执行一系列初始化操作: * 推断应用类型:Spring Boot 会检查类路径下的特定类来判断应用的类型。例如,如果类路径下存在 spring-webmvc,它会推断这是一个基于 Servlet 的 Web 应用。 * 加载初始化器和监听器:它会从 META-INF/spring.factories 文件中加载 ApplicationContextInitializerApplicationListener 的实现类。这些类用于在 Spring 容器的不同生命周期阶段执行自定义逻辑。 * 设置主配置类:确定包含 main 方法的主启动类,以便后续进行组件扫描。

3. 执行 run 方法:核心启动流程

SpringApplication 实例的 run 方法是整个启动过程的核心,它负责创建和配置 Spring 容器。 这个过程可以概括为以下几个关键步骤:

准备环境 (Environment)

Spring Boot 会创建一个 Environment 对象,用于管理应用的配置属性。 它会加载各种来源的配置,包括: * application.propertiesapplication.yml 文件。 * 命令行参数。 * 系统属性和环境变量。

创建应用上下文 (ApplicationContext)

根据之前推断的应用类型,Spring Boot 会创建相应类型的 ApplicationContext(即 IoC 容器)。 * 对于非 Web 应用,通常创建 AnnotationConfigApplicationContext。 * 对于基于 Servlet 的 Web 应用,会创建 AnnotationConfigServletWebServerApplicationContext

准备和刷新上下文

在容器刷新之前,会执行一些准备工作,例如将初始化器应用于上下文,并发布应用启动早期的事件。

随后,最关键的一步是调用 ApplicationContextrefresh() 方法。 这个方法触发了 Spring 容器的整个生命周期,包括:

  • Bean 的加载和实例化:Spring 容器会扫描主配置类所在的包及其子包,查找并注册所有被 @Component@Service@Repository@Controller 等注解标记的类作为 Bean。
  • 自动配置 (Auto-configuration):这是 Spring Boot 的核心特性之一。
    • 启动自动配置的起点是 @SpringBootApplication 注解,它包含了 @EnableAutoConfiguration
    • @EnableAutoConfiguration 通过 @Import(AutoConfigurationImportSelector.class) 来加载自动配置类。
    • AutoConfigurationImportSelector 会扫描所有 jar 包中 META-INF/spring.factories 文件,获取 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键下的所有自动配置类。
    • 每个自动配置类通常都带有一系列的 @Conditional 注解,Spring Boot 会根据当前环境(例如,类路径上是否存在某个特定的类、某个属性是否被设置等)来决定是否要应用这个配置,从而实现按需加载。 例如,当你在项目中加入了 spring-boot-starter-web 依赖时,Spring Boot 会自动配置 Tomcat、DispatcherServlet 等 Web 开发所需的 Bean。

启动内嵌 Web 服务器

如果应用是一个 Web 应用,在容器刷新过程中,会创建并启动内嵌的 Web 服务器(默认为 Tomcat)。 * Spring Boot 通过 ServletWebServerApplicationContext 来处理内嵌 Web 服务器的启动。 * 它会根据类路径上的依赖来决定使用哪种服务器(Tomcat、Jetty 或 Undertow)。 * 服务器启动后,会开始监听指定的端口(默认为 8080),准备接收客户端请求。

4. 启动完成

在容器刷新和 Web 服务器启动之后,run 方法会执行一些收尾工作,例如调用 ApplicationRunnerCommandLineRunner 接口的实现,允许用户在应用启动后执行一些自定义的初始化代码。至此,Spring Boot 容器的启动过程就全部完成了。

总结来说,Spring Boot 的启动流程是一个高度自动化和可扩展的过程,它通过约定大于配置的思想,利用自动配置和内嵌 Web 服务器等特性,极大地简化了 Spring 应用的开发、配置和部署。