Spring Boot 的启动过程可以分为以下几个关键步骤:
1. SpringApplication
初始化
Spring Boot 应用的启动是通过调用 SpringApplication.run()
方法完成的。在这个过程中,Spring Boot 会通过 SpringApplication
类对应用进行初始化,包括设置默认配置、准备环境、创建上下文等。
关键代码示例:
SpringApplication.run(Application.class, args);
在 run()
方法中,SpringApplication
对象会进行一系列的初始化工作:
- 推断应用类型:根据项目是否包含
web
相关的依赖,Spring Boot 会自动推断应用是标准的MVC
应用、Reactive Web
应用还是非Web
应用。 - 设置环境(Environment):Spring Boot 会根据操作系统、配置文件等信息,自动配置应用环境。
- 加载
ApplicationContext
:根据推断的应用类型加载相应的ApplicationContext
,比如AnnotationConfigApplicationContext
或WebApplicationContext
。
2. 启动监听器和初始化器
SpringApplication
会在启动时触发 ApplicationListener
和 ApplicationContextInitializer
。
ApplicationListener
:在SpringApplication
初始化的过程中,Spring Boot 会发布一系列事件(如环境准备、上下文准备、启动完成等),这些事件可以由ApplicationListener
来监听和处理。ApplicationContextInitializer
:用于在ApplicationContext
刷新之前对上下文进行自定义处理。
3. 准备环境
Spring Boot 使用 ConfigurableEnvironment
来抽象应用的环境。它包括了系统环境变量、Java 虚拟机参数、命令行参数等。
- 加载外部配置文件(如
application.properties
或application.yml
),并将其注入到 Spring 环境中。 - 设置一些默认属性,比如端口号、编码格式等。
4. 创建并刷新 ApplicationContext
Spring Boot 根据应用类型创建相应的 ApplicationContext
实例,比如 AnnotationConfigServletWebServerApplicationContext
(用于 Web 应用)。
- Bean 加载:Spring Boot 会扫描应用上下文中的 Bean,并根据注解(如
@Component
、@Service
等)或 XML 配置来实例化和装配这些 Bean。 - 自动配置:Spring Boot 提供了大量的自动配置(Auto Configuration),在上下文刷新时自动完成配置,如数据库连接、MVC 配置等。
- 容器刷新:Spring 会在这个阶段完成对应用上下文的刷新操作,并初始化所有单例 Bean。
5. 启动内嵌的 Web 容器
如果是 Web 应用,Spring Boot 会自动启动嵌入式的 Web 容器,比如 Tomcat、Jetty 或 Undertow。
- Spring Boot 会创建并初始化
ServletWebServerApplicationContext
,然后启动内嵌的服务器,并将 Spring 的DispatcherServlet
注册到服务器中。 - Web 容器启动完成后,应用将开始监听 HTTP 请求。
6. 执行 CommandLineRunner
和 ApplicationRunner
当 ApplicationContext
刷新并且所有 Bean 都初始化完成后,Spring Boot 会调用实现了 CommandLineRunner
或 ApplicationRunner
接口的 Bean,允许开发者在应用启动时执行一些自定义逻辑。
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("Application started with arguments: " + Arrays.toString(args));
}
}
7. 应用启动完成
Spring Boot 在完成所有初始化和配置后,会触发 ApplicationStartedEvent
,并正式进入运行状态,开始接受请求或执行任务。
8.总结
Spring Boot 启动过程包含多个步骤,从初始化 SpringApplication
到创建和配置应用上下文,再到启动嵌入式 Web 容器和执行自定义逻辑,整个过程高度自动化且灵活,通过各种机制(如事件、监听器、自动配置)为开发者提供了简化的启动和配置体验。