自学内容网 自学内容网

Spring Boot 的启动流程

1. 创建 SpringApplication 对象

当我们调用 SpringApplication.run(MainApplication.class, args) 时,Spring Boot 首先会创建一个 SpringApplication 对象,主要做以下工作:

  • 标记启动类:Spring Boot 会找到主配置类(通常带有 @SpringBootApplication 注解),这个类是应用的入口。@SpringBootApplication 是一个复合注解,包含了:

    • @Configuration:标记这是一个配置类,可以定义 Bean。
    • @EnableAutoConfiguration:启用自动配置,Spring Boot 会根据项目依赖和配置自动装配所需的组件。
    • @ComponentScan:自动扫描当前包及子包中的组件,比如控制器(@Controller)、服务(@Service)等。
  • 确定应用类型SpringApplication 判断应用的类型是普通应用、Web 应用还是响应式 Web 应用。比如:

    • NONE:非 Web 应用(如控制台应用)。
    • SERVLET:传统 Web 应用,加载 Spring MVC。
    • REACTIVE:响应式 Web 应用,加载 Spring WebFlux。
  • 设置启动模式:默认情况下,Spring Boot 应用会以“单实例”模式启动,也可以通过设置改变运行模式,比如 SpringApplication.setWebApplicationType() 方法。

2. 配置运行环境(Environment)

在启动过程中,Spring Boot 会初始化应用的环境信息。这一步是将应用的配置、环境变量和系统属性都加载到 Environment 中,方便后续使用。

  • 加载系统环境变量:Spring Boot 会自动加载操作系统中的环境变量(如 System.getenv()),这些变量可以用于配置,比如数据库地址、应用的运行端口等。

  • 加载配置文件:Spring Boot 会自动查找 application.propertiesapplication.yml 文件,读取其中的配置信息。这些配置通常包括:

    • 服务器端口(如 server.port=8080),指定应用监听的端口。
    • 数据库连接信息(如 spring.datasource.url),设置数据库的 URL。
    • 日志级别(如 logging.level),设置日志输出的详细程度。
  • 多重配置来源的优先级:Spring Boot 支持多种配置来源(如命令行参数、环境变量、配置文件等),并按优先级覆盖。比如,命令行参数的优先级高于配置文件中的配置。

3. 加载监听器和初始化组件

Spring Boot 在启动时会加载一些监听器和初始化器,这些组件主要用来监控和扩展启动流程。

  • 加载监听器(ApplicationListener):Spring Boot 会从 META-INF/spring.factories 文件中加载配置的监听器。这些监听器可以监听并处理应用的启动事件,例如:

    • ApplicationStartingEvent:在应用启动时触发,通常用于记录日志或初始化资源。
    • ApplicationEnvironmentPreparedEvent:在环境配置加载完成后触发,可以用于在环境中设置额外的属性。
    • ApplicationReadyEvent:在应用启动完成时触发,表明应用已准备好接收请求。
  • 加载初始化器(ApplicationContextInitializer):初始化器用于在创建 ApplicationContext 之前做一些设置或初始化,比如:

    • 数据源初始化:可以在此阶段初始化数据库连接。
    • 缓存设置:初始化缓存配置信息。

4. 自动配置和 Bean 加载

这个步骤是 Spring Boot 的核心之一,它通过自动配置来帮我们省去了大量的手工配置工作。Spring Boot 通过自动配置机制帮我们创建和管理所有需要的组件(Bean):

  • 自动配置:Spring Boot 会自动加载和配置我们所需的组件,比如数据库连接、Web 服务器、数据源等。它通过扫描配置文件和依赖库来决定需要加载的内容,比如如果依赖了 spring-boot-starter-data-jpa,它会自动配置 JPA 和数据库。

  • Bean 加载:在自动配置的过程中,Spring Boot 会将所有标记了 @Component@Service@Repository@Controller 等注解的类加载为 Bean。这些 Bean 是应用的核心组件,比如控制器、服务类、数据层等。

  • 依赖注入:在创建 Bean 时,Spring Boot 会自动将这些组件所依赖的其他 Bean 注入进去,比如如果一个控制器需要调用服务类,Spring Boot 会自动为它提供所需的服务类实例。

5. 启动嵌入式 Web 服务器

如果这是一个 Web 应用,Spring Boot 会启动内嵌的 Web 服务器,例如 Tomcat、Jetty 或 Undertow。具体步骤如下:

  • 启动服务器:Spring Boot 会自动启动 Tomcat 服务器(默认)并开始监听指定端口,比如默认是 8080。服务器启动后,应用会自动对外提供 HTTP 服务。

  • 加载控制器:Spring Boot 会扫描并加载所有 @Controller@RestController 标注的类,将它们注册为控制器。控制器的职责是接收并处理客户端的 HTTP 请求,返回相应的响应结果。

  • 支持过滤器和拦截器:在启动服务器时,Spring Boot 还会配置和注册 Filter(过滤器)和 Interceptor(拦截器),以支持请求的前置和后置处理。

  • WebSocket 支持:如果项目中包含 WebSocket 依赖,Spring Boot 也会自动加载 WebSocket 支持,使得应用可以接收 WebSocket 连接,用于实时通信。

6. 触发启动事件

在所有配置加载完成后,Spring Boot 会触发几个“启动事件”:

  • 启动完成事件(ApplicationStartedEvent):Spring Boot 会在应用完成初始化后发布一个“启动完成”事件,开发者可以使用这个事件来执行启动后的初始化工作,比如启动定时任务。

  • 准备就绪事件(ApplicationReadyEvent):这个事件表示应用完全启动完毕,所有组件都已准备好,应用可以正式开始接收请求了。

  • 启动失败事件(ApplicationFailedEvent):如果在启动过程中遇到错误,Spring Boot 会发布一个启动失败事件。开发者可以通过这个事件捕获启动时的错误日志,进行故障排查。

7. 应用进入运行状态

在经过上面所有步骤后,Spring Boot 应用已经完全启动完毕,可以开始对外提供服务。此时整个启动流程已经完成,应用进入正式的运行状态:

  • 接收请求:对于 Web 应用,嵌入式服务器已经在指定端口监听,可以接收外部请求并进行处理。
  • 任务执行:如果应用有定时任务或者后台任务,它们会在应用启动后正常执行。

原文地址:https://blog.csdn.net/m0_73837751/article/details/143331744

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!