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.PropertiesLauncher
或org.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 初始化
- 创建
SpringApplication
实例 - 推断应用类型(如
SERVLET
、REACTIVE
) - 设置初始化器(
ApplicationContextInitializer
) - 设置监听器(
ApplicationListener
) - 推断主配置类(包含 [main](file://E:\Project\untitled1\src\main\java\Main.java#L14-L77) 方法的类)
5.3 运行阶段
-
启动准备:
- 创建并启动计时器
- 设置 Java 系统属性
- 配置日志系统
-
创建 ApplicationContext:
- 根据应用类型创建合适的
ApplicationContext
实现 - 如
AnnotationConfigServletWebServerApplicationContext
(用于 Web 应用)
- 根据应用类型创建合适的
-
准备 ApplicationContext:
- 设置环境(Environment)
- 应用初始化器
- 打印 Banner 信息
-
刷新 ApplicationContext:
- 注册单例 Bean
- 执行 BeanFactory 后置处理器
- 注册 Bean 后置处理器
- 初始化消息源
- 初始化应用事件广播器
- 注册监听器
- 实例化所有剩余的单例 Bean(核心阶段)
-
启动 Web 服务器(Web 应用):
- 启动嵌入式 Web 服务器(如 Tomcat、Jetty)
- 发布
ServletWebServerInitializedEvent
事件
6. 应用运行时
- Spring 容器完全初始化,所有 Bean 都已创建并注入依赖
- Web 服务器开始监听指定端口,处理请求
- 应用进入正常的运行状态,响应用户请求
7. 应用关闭
- 接收到关闭信号(如 Ctrl+C 或 SIGTERM)
- Spring Boot 优雅地关闭 ApplicationContext
- 关闭 Web 服务器
- 执行清理工作
- JVM 终止
整个过程体现了 Spring Boot"约定优于配置"的理念,通过自动配置机制大大简化了企业级应用的开发和部署。