第二篇 SpringBoot项目启动流程

SpringBoot项目启动流程

SpringBoot项目的启动流程主要涉及初始化、配置加载、应用启动等关键步骤,以下是详细解析:

初始化阶段
  1. 入口方法

    SpringBoot应用通过main方法启动,调用SpringApplication.run(Class<?> primarySource, String... args)primarySource通常是主配置类(标注@SpringBootApplication的类)。

  2. SpringApplication实例化

    • 通过SpringApplication构造函数初始化,使用SpringApplicationBuilder或直接构造。
    • 推断应用类型(Servlet、Reactive或None)。
    • 通过SpringFactoriesLoader加载META-INF/spring.factories中的配置,初始化ApplicationContextInitializerApplicationListener
  3. 环境准备

    • 创建ConfigurableEnvironment(根据应用类型选择StandardServletEnvironmentStandardReactiveEnvironment)。
    • 配置PropertySources(如系统属性、环境变量、配置文件等)。
运行阶段
  1. 上下文创建

    • 根据应用类型创建ApplicationContext(如AnnotationConfigServletWebServerApplicationContext)。
    • 准备BeanDefinitionLoader,扫描主配置类及其子包下的组件。
  2. 前置处理

    • 执行ApplicationContextInitializerinitialize方法,扩展上下文初始化逻辑。
    • 发布ApplicationStartingEvent事件,通知监听器。
  3. 刷新上下文

    • 调用AbstractApplicationContext.refresh()方法,触发Bean工厂初始化、Bean加载等核心流程。
    • 执行BeanFactoryPostProcessor(如ConfigurationClassPostProcessor处理@Configuration类)。
    • 注册并实例化单例Bean,包括自动配置类(通过@EnableAutoConfiguration加载)。
  4. 内嵌服务器启动

    • 如果是Web应用,初始化内嵌Tomcat、Jetty或Undertow服务器。
    • 发布ApplicationReadyEvent事件,标志应用启动完成。
关键扩展点
  • 自定义初始化逻辑

    实现ApplicationContextInitializer接口,通过spring.factoriesSpringApplication.addInitializers()注册。

  • 监听事件

    实现ApplicationListener接口,监听如ApplicationStartedEventApplicationFailedEvent等事件。

  • 自动配置原理
    @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) {
        // 自定义逻辑
    }
}
流程总结
  1. 解析启动参数和环境配置。
  2. 初始化应用上下文并加载Bean定义。
  3. 执行自动配置和依赖注入。
  4. 启动内嵌服务器(Web应用)或完成初始化(非Web应用)。
  5. 发布事件通知启动状态。
相关推荐
不漫游4 分钟前
Web聊天室测试报告
java
MegaDataFlowers9 分钟前
依赖注入(DI)
java·开发语言
晓纪同学16 分钟前
EffctiveC++_01第一章
java·开发语言·c++
zhen_hong17 分钟前
ReactAgent原理
android·java·javascript
汤姆yu17 分钟前
IDEA使用通义灵码做现有项目迭代开发保姆级教程
java·ide·intellij-idea·灵码
我真会写代码18 分钟前
Java事务核心原理与实战避坑指南
java·开发语言·数据库
康世行19 分钟前
IDEA集成AI辅助工具推荐(好用不卡顿)
java·人工智能·intellij-idea
Zhao_yani21 分钟前
微服务核心组件:Gateway
java·微服务·gateway
柠檬Leade21 分钟前
IDEA中 java: 程序包lombok不存在 问题解决
java·开发语言·maven·intellij-idea·依赖不存在
盐水冰22 分钟前
【烘焙坊项目】后端搭建(14) - 工作台&导出数据报表
java·后端·学习