SpringBoot项目启动流程
SpringBoot项目的启动流程主要涉及初始化、配置加载、应用启动等关键步骤,以下是详细解析:
初始化阶段
-
入口方法
SpringBoot应用通过
main方法启动,调用SpringApplication.run(Class<?> primarySource, String... args)。primarySource通常是主配置类(标注@SpringBootApplication的类)。 -
SpringApplication实例化
- 通过
SpringApplication构造函数初始化,使用SpringApplicationBuilder或直接构造。 - 推断应用类型(Servlet、Reactive或None)。
- 通过
SpringFactoriesLoader加载META-INF/spring.factories中的配置,初始化ApplicationContextInitializer和ApplicationListener。
- 通过
-
环境准备
- 创建
ConfigurableEnvironment(根据应用类型选择StandardServletEnvironment或StandardReactiveEnvironment)。 - 配置
PropertySources(如系统属性、环境变量、配置文件等)。
- 创建
运行阶段
-
上下文创建
- 根据应用类型创建
ApplicationContext(如AnnotationConfigServletWebServerApplicationContext)。 - 准备
BeanDefinitionLoader,扫描主配置类及其子包下的组件。
- 根据应用类型创建
-
前置处理
- 执行
ApplicationContextInitializer的initialize方法,扩展上下文初始化逻辑。 - 发布
ApplicationStartingEvent事件,通知监听器。
- 执行
-
刷新上下文
- 调用
AbstractApplicationContext.refresh()方法,触发Bean工厂初始化、Bean加载等核心流程。 - 执行
BeanFactoryPostProcessor(如ConfigurationClassPostProcessor处理@Configuration类)。 - 注册并实例化单例Bean,包括自动配置类(通过
@EnableAutoConfiguration加载)。
- 调用
-
内嵌服务器启动
- 如果是Web应用,初始化内嵌Tomcat、Jetty或Undertow服务器。
- 发布
ApplicationReadyEvent事件,标志应用启动完成。
关键扩展点
-
自定义初始化逻辑
实现
ApplicationContextInitializer接口,通过spring.factories或SpringApplication.addInitializers()注册。 -
监听事件
实现
ApplicationListener接口,监听如ApplicationStartedEvent、ApplicationFailedEvent等事件。 -
自动配置原理
@EnableAutoConfiguration通过SpringFactoriesLoader加载META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中的配置类,条件化生效(如@ConditionalOnClass)。
示例代码片段
启动类示例:
java
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
自定义初始化器示例:
java
public class CustomInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext context) {
// 自定义逻辑
}
}
流程总结
- 解析启动参数和环境配置。
- 初始化应用上下文并加载Bean定义。
- 执行自动配置和依赖注入。
- 启动内嵌服务器(Web应用)或完成初始化(非Web应用)。
- 发布事件通知启动状态。