念两句诗

SpringBoot的启动原理、流程和机制

2024-09-23 浏览 面试必备 1791字 7 min read

springboot 启动原理、启动过程、启动机制的介绍

1.启动原理

Spring Boot的一个核心特点是自动配置,它会自动配置Spring应用程序基于项目中添加的jar依赖。如果项目中包括 spring-boot-starter-web 依赖,Spring Boot将会配置应用程序使用Tomcat作为默认服务器,并且将基本的MVC支持加入容器中,这是通过 classpath 和已经定义的beans来决定配置类的自动应用来实现的,使用的是@EnableAutoConfiguration 注解。

1.1起步依赖(starters)

Spring Boot 的起步依赖是一组方便的依赖描述符,你可以在应用程序的 pom.xml 中添加它们。每一个起步依赖都旨在简化构建配置,提供所需的依赖。这让你在不担心版本冲突的情况下快速开始一个功能完备的开发环境。

1.2命令行界面

Spring Boot提供一个可选的CLI,用于快速开发和原型制作Spring应用,CLI使用Spring的@* 注解进行编码,允许通过 Groovy 语言快速编写 Spring 应用。

1.3内嵌服务器

Spring Boot 内置了常见的服务器(如 Tomcat、Jetty 或 Undertow),无需复杂的服务器配置,只需一个简单的 main() 方法,即可将应用打包为单一的、可执行的 JAR 文件,这个 JAR 文件包含了一切必要的依赖、类和资源。

1.4外部化配置

Spring Boot 允许你通过外部配置(如 properties 文件、YAML 文件、环境变量和命令行参数)来管理应用程序的配置。这使得你的应用可以在不同环境中使用相同的代码,而不需要重新构建。

1.5监控和管理

Spring Boot Actuator 提供了许多生产级的特性,如监控和管理应用程序。它可以通过 HTTP 或 JMX 访问应用的内部状态。

1.6无代码生成和XML配置

Spring Boot 被设计为尽可能地减少显式配置。它使用条件注解来评估环境,自动配置 Spring 容器。Spring Boot 应用不需要使用 XML 配置,尽管可以选择使用 XML 来定义配置,但默认情况下,这种需求被最小化了。

通过以上原理,Spring Boot 实现了“约定大于配置”的软件设计范式,极大地简化了基于 Spring 的应用开发和服务部署。

2.启动过程

2.1启动入口

Spring Boot 应用的启动从一个包含 main() 方法的主类开始。这个主类会使用 SpringApplication.run() 方法来启动 Spring 应用。通常,这个类还带有 @SpringBootApplication 注解,它是一个组合注解,包含了 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan

2.2创建SpringApplication 对象

当调用 SpringApplication.run() 时,首先会创建一个 SpringApplication 对象。这个对象负责管理 Spring 应用的启动和初始化。它会设置一些基础属性,比如是否应该添加命令行属性,是否需要横幅(Banner)等。

2.3运行SpringApplication

接下来,SpringApplication 对象调用其 run() 方法。这个过程涉及多个重要步骤:

  • 初始化应用上下文:根据你选择的 web 环境类型(如 Servlet 或 Reactive),Spring Boot 设置合适的应用上下文(ApplicationContext)。

  • 环境准备:在应用上下文准备前,先准备环境(Environment),这包括配置文件、命令行参数、环境变量等的解析。

  • 横幅输出:如果启用,Spring Boot 的启动过程中会在控制台打印一个横幅。

  • 注册应用上下文初始化器和监听器:应用上下文初始化器(ApplicationContextInitializer)和应用事件监听器(ApplicationListener)会被加载和注册,它们可以在上下文的生命周期的不同阶段执行操作。

  • 加载 Bean 定义:通过扫描类路径中的组件和配置类(由 @ComponentScan@Configuration 等注解指定)来加载 Bean 定义。

2.4自动配置和Bean的创建

  • 自动配置@EnableAutoConfiguration 注解激活了自动配置的魔法,它告诉 Spring Boot 基于添加到项目中的 jar 依赖,尝试去猜测并配置你可能需要的 Bean。自动配置类会在应用上下文中被条件化地执行。
  • Bean 实例化:在所有的配置类和组件被加载之后,Spring 容器会根据需要创建和配置 Bean 实例。

2.5运行应用上下文

  • 刷新应用上下文:完成所有配置后,应用上下文会被刷新,此时所有的 Bean 都已注册完毕,且已准备就绪。
  • 触发命令行运行器:如果应用中包含 CommandLineRunnerApplicationRunner Bean,它们会在此时执行。

2.6应用就绪

  • 触发应用就绪事件:最后,一个 ApplicationReadyEvent 被发布,表明应用已完全启动并准备好接收请求。

3.启动过程详解

  • Spring Boot的启动过程从加载包含 main() 方法的主类开始。这个主类通常使用 @SpringBootApplication 注解标记,它是一个组合注解,包含了 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan

  • 在主类中调用 SpringApplication.run() 方法,会创建一个 SpringApplication 对象。这个对象负责管理 Spring 应用的启动和初始化。

  • SpringApplication 对象负责准备 Spring 应用的环境。这包括读取配置文件、解析命令行参数、收集系统环境变量等。这些环境属性将会被用于配置应用上下文和其他组件。

  • SpringApplication 使用环境信息初始化 Spring 应用上下文(ApplicationContext)。根据应用是 Web 应用还是非 Web 应用,Spring Boot 会创建对应的应用上下文。

  • 应用上下文初始化后,Spring Boot 开始加载 Bean 的定义。它会扫描项目中的组件和配置类(由 @ComponentScan@Configuration 注解指定),并将它们注册到应用上下文中。

  • Spring Boot 的自动配置机制会根据项目中添加的 jar 依赖,尝试猜测并配置可能需要的 Bean。自动配置类会根据条件进行加载和执行,以确保配置的正确性和合理性。

  • 所有配置类和组件被加载后,Spring 容器会根据需要创建和配置 Bean 实例。这些 Bean 可能是由 Spring Boot 提供的自动配置,也可能是开发者自定义的 Bean。

  • 当所有 Bean 定义加载完毕后,应用上下文会被刷新。在这个阶段,Spring Boot 会执行一系列的初始化动作,确保所有 Bean 都被正确地创建和配置。

  • 应用上下文初始化完成后,Spring Boot 将应用状态标记为“已启动”。此时,应用已准备就绪,可以处理请求和响应。

  • 在应用启动过程中,Spring Boot 会触发一系列的生命周期事件,如应用启动事件、应用就绪事件等。开发者可以监听这些事件并执行相应的操作。通过这些步骤,Spring Boot 实现了一个简洁而高效的启动过程,使得开发者能够快速启动和运行一个独立的、生产级的应用程序。

EOF