第二篇 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. 发布事件通知启动状态。
相关推荐
大鸡腿同学5 小时前
【成长类】《只有偏执狂才能生存》读书笔记:程序员的偏执型成长地图
后端
0xDevNull5 小时前
MySQL数据冷热分离详解
后端·mysql
一定要AK5 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao5 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
AI袋鼠帝6 小时前
OpenClaw(龙虾)最强开源对手!Github 40K Star了,又一个爆火的Agent..
后端
KevinCyao6 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏4946 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
總鑽風6 小时前
搭建Spring Boot + ELK日志平台,实现可视化日志监控
spring boot·elk·macos
不吃香菜学java7 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
wuxinyan1237 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题