springboot从文件开始运行的虚拟机过程

Spring Boot 应用从文件开始到运行在 JVM 上的过程比普通 Java 程序更加复杂,它结合了标准 Java 程序的启动流程和 Spring 框架特有的初始化机制。下面是详细的过程:

1. 编译阶段

  • Spring Boot 项目中的 [.java](file://E:\Project\untitled1\src\main\java\Main.java) 文件通过 Maven/Gradle 等构建工具编译成 [.class](file://E:\Project\untitled1\target\classes\Main.class) 字节码文件
  • 依赖的库被打包进最终的可执行 JAR 文件中

2. 启动JVM

当执行 java -jar your-spring-boot-app.jar 命令时:

  • JVM 启动并创建实例
  • 将 Spring Boot 应用 JAR 文件加入到类路径中
  • 加载必要的 JVM 运行时类库

3. JAR 文件执行机制

Spring Boot 可执行 JAR 文件有特殊的结构:

  • 使用 org.springframework.boot.loader.PropertiesLauncherorg.springframework.boot.loader.Launcher 作为主类
  • 包含 BOOT-INF/classes(应用类)、BOOT-INF/lib(依赖库)等目录
  • MANIFEST.MF 文件中指定了主类和启动类

4. 类加载过程

Spring Boot 使用自定义类加载器:

  • LaunchedURLClassLoader 扩展了标准的 URLClassLoader
  • 负责加载应用类和依赖库
  • 实现了特殊的类加载顺序,确保应用类优先于依赖库中的类

5. Spring Boot 启动流程

5.1 入口点

  • SpringApplication 类的 [main](file://E:\Project\untitled1\src\main\java\Main.java#L14-L77) 方法开始执行
  • 通常在应用主类中调用 SpringApplication.run(YourApplication.class, args)

5.2 SpringApplication 初始化

  1. 创建 SpringApplication 实例
  2. 推断应用类型(如 SERVLETREACTIVE
  3. 设置初始化器(ApplicationContextInitializer
  4. 设置监听器(ApplicationListener
  5. 推断主配置类(包含 [main](file://E:\Project\untitled1\src\main\java\Main.java#L14-L77) 方法的类)

5.3 运行阶段

  1. 启动准备

    • 创建并启动计时器
    • 设置 Java 系统属性
    • 配置日志系统
  2. 创建 ApplicationContext

    • 根据应用类型创建合适的 ApplicationContext 实现
    • AnnotationConfigServletWebServerApplicationContext(用于 Web 应用)
  3. 准备 ApplicationContext

    • 设置环境(Environment)
    • 应用初始化器
    • 打印 Banner 信息
  4. 刷新 ApplicationContext

    • 注册单例 Bean
    • 执行 BeanFactory 后置处理器
    • 注册 Bean 后置处理器
    • 初始化消息源
    • 初始化应用事件广播器
    • 注册监听器
    • 实例化所有剩余的单例 Bean(核心阶段)
  5. 启动 Web 服务器(Web 应用):

    • 启动嵌入式 Web 服务器(如 Tomcat、Jetty)
    • 发布 ServletWebServerInitializedEvent 事件

6. 应用运行时

  • Spring 容器完全初始化,所有 Bean 都已创建并注入依赖
  • Web 服务器开始监听指定端口,处理请求
  • 应用进入正常的运行状态,响应用户请求

7. 应用关闭

  • 接收到关闭信号(如 Ctrl+C 或 SIGTERM)
  • Spring Boot 优雅地关闭 ApplicationContext
  • 关闭 Web 服务器
  • 执行清理工作
  • JVM 终止

整个过程体现了 Spring Boot"约定优于配置"的理念,通过自动配置机制大大简化了企业级应用的开发和部署。

posted @ 2025-08-28 20:53  一刹流云散  阅读(16)  评论(0)    收藏  举报