第二篇 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. 发布事件通知启动状态。
相关推荐
高频因子挖掘机12 分钟前
量化回测应该保存不复权数据吗?从数据口径到收益计算的工程实践
后端·github·api
高频因子挖掘机1 小时前
实时行情为什么不应该逐只股票请求?批量查询与标的池管理实践
后端·github·api
程序猿DD6 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
蛋蛋的就会顺顺的9 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
余槐i9 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8269 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡9 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
凤山老林10 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne11 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF12 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用