跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Boot 启动类到底是什么

Spring Boot 的引导类通常叫 `XXApplication`,这只是命名约定,不是语法要求。它的核心是 `@SpringBootApplication`,里面包含配置类、组件扫描和自动配置三部分,决定了容器从哪里开始装配 Bean。`SpringApplication.run()` 会依次完成应用类型判断、环境准备、上下文创建、Bean 刷新和启动后回调。打成可执行 Jar 后,`Main-Class` 指向 `JarLauncher`,`Start-Class` 才是业务引导类,二者分工不同。

性能调优发布于 2026/6/30更新于 2026/7/2113 浏览

引导类的名字,只是约定

Spring Boot 里常见的 XXXApplication,更多是大家约出来的写法,不是语法要求。它像个入口标识,提醒你项目从这里起步。真正起作用的,不是名字,而是这个类上挂着的 @SpringBootApplication,以及里面那个 main 方法。

// 一个典型的 Spring Boot 引导类
@SpringBootApplication
public class MyAwesomeApp {
    public static void main(String[] args) {
        SpringApplication.run(MyAwesomeApp.class, args);
    }
}

@SpringBootApplication 里到底包了什么

这个注解看起来像一个入口开关,其实是三个注解叠在一起:

  • @SpringBootConfiguration:本质上还是 @Configuration。引导类本身可以当配置类用,也能往容器里继续加 @Bean。
  • @ComponentScan:默认从引导类所在包开始扫,子包都会被带上。所以引导类一般放在根包里,不然组件扫描范围容易漏。
  • @EnableAutoConfiguration:自动配置真正干活的地方。类路径里有什么依赖,Spring Boot 就据此推断该补哪些 Bean。比如加了 web starter,DispatcherServlet 和内嵌 Tomcat 这些东西就会跟着起来。

SpringApplication.run() 不是一行就结束

main 方法只做了一个动作:把启动交给 SpringApplication.run()。后面那一长串流程,才是 Spring Boot 自举的核心。

启动时大致会走几步:先判断应用类型,是 Servlet、WebFlux,还是普通应用;再从 META-INF/spring.factories 里把初始化器和监听器加载出来;接着推断主类,也就是带 main 的那个引导类。

真正进入运行阶段后,Spring Boot 会先发启动事件,准备环境变量和配置文件,再创建对应的 ApplicationContext。上下文准备好以后,组件扫描、配置类解析、Bean 定义加载这些事会一起发生。最后是 refresh(),这是 Spring 最核心的一步:Bean 实例化、依赖注入、初始化、自动配置落地,基本都在这里完成。内嵌 Web 服务器也是这时候起来的。

如果项目里实现了 ApplicationRunner 或 CommandLineRunner,它们会在上下文刷新后执行。到 ApplicationReadyEvent 发出来,应用才算真的可用了。

还能手动定制启动过程

如果默认启动方式不够用,可以自己 new 一个 SpringApplication 出来改配置。这个场景不算多,但在需要关掉 Banner、改默认端口、塞自定义监听器时挺顺手。

@SpringBootApplication
public class  {
        {
        
            ();
        app.setPrimarySources(Set.of(CustomizedApp.class));
        app.setBannerMode(Banner.Mode.OFF); 
        app.setDefaultProperties(Collections.singletonMap(, )); 
        
        app.addListeners( ());
           app.run(args);
        
    }
}
CustomizedApp
public
static
void
main
(String[] args)
// SpringApplication app = new SpringApplication(CustomizedApp.class);
SpringApplication
app
=
new
SpringApplication
// 关闭 Banner
"server.port"
"8081"
// 设置默认端口
// 添加自定义监听器
new
MyApplicationListener
ConfigurableApplicationContext
context
=
// ... 可以获取 context 做一些事情

打成 Jar 之后,入口其实换了一层

java -jar myapp.jar 跑起来时,真正先执行的并不是你的业务类,而是 Spring Boot 自带的启动器。META-INF/MANIFEST.MF 里会写得很清楚:

Main-Class: org.springframework.boot.loader.launch.JarLauncher
Start-Class: com.example.myproject.MyAwesomeApp

这里的分工很明确:

  • Main-Class 指向 JarLauncher,它负责搭建类加载环境,从 BOOT-INF/lib 里把依赖加载起来。
  • Start-Class 才是你写的引导类。JarLauncher 做完前置工作后,会反射调用它的 main 方法。

所以从 Jar 的角度看,JarLauncher 才是第一入口;从业务代码角度看,MyAwesomeApp 仍然是应用启动点。两层各管一段,没什么玄学。

结论

XXApplication 是习惯,不是硬规定。引导类的本质是一个带 @SpringBootApplication 的普通 Java 类,它负责把组件扫描、自动配置和 SpringApplication.run() 串起来。真正跑起来时,Spring Boot 先完成环境、上下文和容器刷新,再启动内嵌服务器。打成可执行 Jar 后,物理入口变成 JarLauncher,但业务入口还是你自己的引导类。

目录

  1. 引导类的名字,只是约定
  2. @SpringBootApplication 里到底包了什么
  3. SpringApplication.run() 不是一行就结束
  4. 还能手动定制启动过程
  5. 打成 Jar 之后,入口其实换了一层
  6. 结论
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 强化学习与 DeepSeek-R1 训练原理详解
  • 算法基础:递归初阶实战解析
  • 二分查找算法详解与经典题解
  • 基于 DeepFace 和 OpenCV 的实时情绪分析系统
  • 恩智浦发布S32N7处理器系列,加速AI驱动汽车发展
  • C++ 二叉搜索树 (BST) 原理与核心实现详解
  • Web 虚拟卡销售平台实现方案
  • AIGC 创作平台设计指南:高保真案例拆解与原型实测
  • LLaMA 3.1 模型部署与实战:构建智能聊天机器人
  • Java AI 全流程开发指南:从需求到部署
  • 2023 年 9 月计算机二级考试复习指南与题库解析
  • 利用 KAT-Coder-Pro V1 零代码开发小红书卡片 MCP 工具
  • OpenClaw QQ 机器人接入与部署指南
  • Python 数据科学工具链入门:NumPy、Pandas、Matplotlib 实战指南
  • Claude Code 本地接入与 API 配置指南
  • C++物理引擎稳定性提升的关键设计原则
  • 扩散模型原理与图像生成实战:DDPM 核心解析与 PyTorch 实现
  • GitHub 2026 年开源 AI 项目热度深度分析
  • OpenCV 图像操作基础:读写、像素访问与内存管理
  • Ubuntu 22.04 下基于 ROS2 Humble 的 PX4 仿真环境搭建

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online