Spring Boot 启动流程详解!

开发
Spring Boot 的启动过程虽然复杂,但是通过其自动化配置和简化的开发模式,开发者可以迅速构建和维护大型应用。

Spring Boot 是一个用于简化 Spring 应用程序开发的框架,提供了便捷的配置和自动化功能。这篇文章,我们将深入探讨 Spring Boot 的启动流程,包括其背后的重要组件和原理。

1. Spring Boot 概述

Spring Boot 是基于 Spring Framework 的一套开源框架,旨在简化 Spring 应用的设置和开发。Spring Boot 允许开发者通过“约定优于配置”的方式,快速构建生产级别的微服务应用程序。它自带了许多开箱即用的功能,如内嵌服务器(Tomcat、Jetty)、健康检查、监控工具等,减少了开发者的配置工作。

2. Spring Boot 启动流程概述

Spring Boot 的启动流程大致可以分为以下几个步骤:

  • Bootstrap引导:虚拟机启动,加载 Spring Boot 相关类。
  • SpringApplication类:创建 SpringApplication 实例,设置应用上下文。
  • ApplicationContext创建:它可以根据不同的配置创建应用上下文(如 AnnotationConfigApplicationContext、WebApplicationContext)。
  • 初始化Bean:扫描和注册 Bean,执行依赖注入。
  • 运行:创建应用的环境并运行。

接下来,我们将对每一个步骤进行详细的分析。

3. Bootstrap 引导

(1) 启动主类

Spring Boot 应用程序的入口通常是一个带有 @SpringBootApplication 注解的类。这个注解是一个组合注解,结合了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan。

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

(2) JVM 启动

在启动过程中,JVM 会加载主类 Application,并调用 main 方法。SpringApplication.run 方法是启动 Spring Boot 应用的关键。

4. SpringApplication 类

(1) 创建 SpringApplication 实例

SpringApplication.run() 实际上是一个静态方法,它会创建 SpringApplication 实例,并为其配置一些初始参数。

public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
    return new SpringApplication(primarySource).run(args);
}

在这个方法之前,Spring Boot 会进行一些环境的准备,具体包括:

  • 设置应用名称:可以通过 spring.application.name 属性设置。
  • 准备默认配置:Spring Boot 会根据类路径中的配置文件来初始化默认配置。

(2) 运行方法

run 方法的核心在于 createApplicationContext() 方法,它会创建应用上下文,通常是 AnnotationConfigServletWebApplicationContext 或 GenericWebApplicationContext。

5. 应用上下文的创建

(1) ApplicationContext 类型

Spring Boot 支持多种类型的 ApplicationContext,例如:

  • AnnotationConfigApplicationContext:用于带有 Java 配置的应用上下文。
  • GenericWebApplicationContext:用于创建 Web 应用的上下文。
  • AnnotationConfigServletWebApplicationContext:适用于 Spring MVC 应用。

(2) ApplicationContext 的初始化

在创建上下文时,Spring Boot 会执行以下步骤:

  • 根据应用的配置,确定使用哪种类型的 ApplicationContext。
  • 初始化 ApplicationContext 的环境,设置属性源,例如配置文件(application.properties 或 application.yml)。
  • 通过 refresh() 方法加载 Bean 定义,创建 Bean 实例。

6. Bean 的初始化

(1) Bean 定义的读取

Spring Boot 会通过读取classpath下的组件,扫描带有特定注解(例如 @Service, @Controller, @RestController)的类,来自动注册 Bean。这是通过 Spring 的 @ComponentScan 机制实现的。

(2) Bean 注册与依赖注入

在 ApplicationContext 初始化期间,Spring Boot 会使用依赖注入(DI)将 Bean 实例化并注入其依赖。

  • 依赖查找:对于每一个 Bean,Spring 会查找其依赖的 Bean。
  • 实例化:使用构造函数、Setter 方法或字段注入创建 Bean 实例。
  • 初始化:执行 Bean 的初始化方法(如果存在)。

7. 运行与启动

(1) 应用启动

一旦所有的 Bean 初始化完成,Spring Boot 会启动内嵌的 web 服务器(如 Tomcat 或 Jetty)并部署应用。

(2) ApplicationRunner 与 CommandLineRunner

在应用成功启动后,Spring Boot 提供了 ApplicationRunner 和 CommandLineRunner 接口,开发者可以实现这些接口以在应用启动时执行特定的代码,例如进行数据库初始化、加载数据等。

@Component
public class MyStartupRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("My application is running!");
    }
}

8. Spring Context 功能

(1) 事件发布机制

Spring Boot 通过 ApplicationEventPublisher 接口提供了事件发布功能,开发者可以通过发布和监听事件来实现应用的松耦合。

(2) 监控与管理

Spring Boot 的 Actuator 模块提供了许多生产级的监控与管理功能,例如健康检查、指标监控等。通过访问特定的 URL(如 /actuator/health),开发者可以了解应用的运行状态。

9. 可靠性与测试

(1) 配置管理

Spring Boot 支持多种配置机制,如环境变量、配置文件、命令行参数等,极大地方便了应用配置的管理与使用。

(2) 自动化测试

Spring Boot 提供了强大的测试支持,可以通过 @SpringBootTest 注解进行集成测试,支持针对整个 Spring Boot 应用的上下文进行测试。

10. 总结

Spring Boot 的启动过程虽然复杂,但是通过其自动化配置和简化的开发模式,开发者可以迅速构建和维护大型应用。理解启动流程的每一个环节,有助于开发者调试和优化应用的性能。同时,随着微服务架构的普及,Spring Boot 将继续在企业级应用中发挥重要作用。

责任编辑:赵宁宁 来源: 猿java
相关推荐

2023-12-14 13:28:00

Spring流程Web

2023-09-27 08:14:56

2020-07-03 08:00:11

Spring BootSpring Clou流程

2023-06-02 16:24:46

SpringBootSSM

2023-11-06 07:25:51

Spring配置应用程序

2017-04-26 11:00:34

Spring BootHelloWorld详解

2023-04-28 08:43:46

2020-11-02 07:00:29

Spring Boo注解自动化

2017-03-06 15:43:33

Springboot启动

2024-08-13 08:41:18

2024-10-14 17:18:27

2024-11-21 14:42:31

2022-05-06 10:42:09

JavaFlowable引擎

2024-03-26 08:08:08

SpringBPMN模型

2023-03-20 13:41:00

IoC容器Spring

2019-06-20 10:56:28

CentOS系统启动

2021-08-10 20:41:33

AndroidApp流程

2024-08-05 08:45:35

SpringKafkaSCRAM

2024-04-03 15:40:14

WebSocketWeb应用Spring

2022-05-25 09:00:00

令牌JWT安全
点赞
收藏

51CTO技术栈公众号