第二篇 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. 发布事件通知启动状态。
相关推荐
bzmK1DTbd6 分钟前
OpenGL与Java:JOGL库的3D图形渲染实战
java·3d·图形渲染
许彰午6 分钟前
CacheSQL(四):CacheSQLClient——用一张路由表实现水平扩展
java·数据库·缓存·系统架构·政务
许彰午10 分钟前
CacheSQL(三):双 HTTP 引擎与 SQL 查询——接口抽象的价值
java·数据库·sql·缓存
Victor3561 小时前
MongoDB(118)如何在升级过程中进行数据备份?
后端
手握风云-1 小时前
Spring AI:让大模型住进 Spring 生态(三)
java·后端·spring
Victor3561 小时前
MongoDB(117)如何从旧版本迁移到新版本?
后端
咸鱼2.02 小时前
【java入门到放弃】Dubbo
java·开发语言·dubbo
pe7er4 小时前
window管理开发环境篇 - 持续更新
前端·后端
JAVA面经实录9178 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
陈随易9 小时前
有生之年系列,Nodejs进程管理pm2 v7.0发布
前端·后端·程序员