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.properties
或application.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)!