Spring Boot启动过程?
目录
1. 启动入口
2. SpringApplication 初始化
3. 准备环境
4. 创建应用上下文(ApplicationContext)
5. 准备应用上下文
6. 刷新应用上下文
7. 启动 Web 服务器(若为 Web 应用)
8. 发布 ApplicationStartedEvent 事件
9. 执行 Runner
10. 发布 ApplicationReadyEvent 事件
1. 启动入口
Spring Boot 应用的启动从 main
方法开始,main
方法通常位于一个带有 @SpringBootApplication
注解的类中。@SpringBootApplication
是一个组合注解,它包含了 @Configuration
(标识该类为配置类,可定义 Bean 等配置)、@EnableAutoConfiguration
(开启自动配置功能,依据项目依赖自动配置相关组件)和 @ComponentScan
(用于扫描指定包及其子包下的组件,如 @Component
、@Service
、@Repository
、@Controller
等注解标注的类)。示例代码如下:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2. SpringApplication 初始化
SpringApplication.run()
方法会创建一个 SpringApplication
实例,并调用其 run
方法。该实例的初始化过程包含以下关键步骤:
- 推断应用类型:依据类路径上的依赖来判断应用类型,比如包含
spring-boot-starter-web
依赖则推断为 Servlet 应用,若包含相关响应式编程依赖则推断为 Reactive 应用等。 - 设置初始化器(Initializers):通过
SpringFactoriesLoader
从META-INF/spring.factories
文件中加载并应用ApplicationContextInitializer
。这些初始化器可在应用上下文创建前对其进行定制化配置,例如设置属性源等。 - 设置监听器(Listeners):同样借助
SpringFactoriesLoader
加载并应用ApplicationListener
,用于监听应用启动过程中的各类事件,如环境准备完成事件、应用上下文初始化事件等,以便在不同阶段执行相应逻辑。 - 推断主应用类:通过堆栈跟踪的方式推断出主应用类,即包含
main
方法且带有@SpringBootApplication
注解的类。
3. 准备环境
在 run
方法中,Spring Boot 会进行应用环境(Environment
)的准备工作,具