第二篇 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中的配置,初始化ApplicationContextInitializer和ApplicationListener。
  3. 环境准备

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

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

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

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

    • 如果是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) {
        // 自定义逻辑
    }
}
流程总结
  1. 解析启动参数和环境配置。
  2. 初始化应用上下文并加载Bean定义。
  3. 执行自动配置和依赖注入。
  4. 启动内嵌服务器(Web应用)或完成初始化(非Web应用)。
  5. 发布事件通知启动状态。
相关推荐
杨凯凡2 分钟前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
特立独行的猫A24 分钟前
cj-tauri:用仓颉写桌面与鸿蒙 PC 应用
java·后端·python
Lonely丶墨轩29 分钟前
从一个 404 到负数 ID:第三方接口开发中的几次排错
java
聪明的笨猪猪35 分钟前
实际工程问题:AI生成MyBatis批量操作的SQL超限与性能雪崩
java·经验分享·面试·ai编程
文丑颜不良啊35 分钟前
LeetCode2501~2520题目解析
java·leetcode
mldong42 分钟前
同一个节点,同一个人,办两次:jeeflow 的已办撤回
后端·架构
瑞雪兆丰年兮1 小时前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web
唐老板1 小时前
Spring Boot 4 默认开虚拟线程,HikariCP 却成瓶颈
java
脚本自动化开发8 小时前
折叠双屏MU156LA:写稿修图游戏体验
后端