Spring Boot 到底帮你做了什么

举报
哈基米 发表于 2026/10/26 14:53:55 2026/10/26
【摘要】 从 web.xml 时代要配什么讲起,拆开 Spring Boot 真正做的三件事:起步依赖解决版本对齐、自动配置是有条件的装配、内嵌容器反转了启动顺序。最后说清它没帮你做的事——连接池默认值、事务边界,这些还得自己调。

刚开始学 Java Web 那会儿,我照着教程配 web.xml,一个 DispatcherServlet 的 servlet-mapping 少写一个斜杠,Tomcat 启动日志翻了三遍才定位到。后来第一次用 Spring Boot,建个空项目,main 里一行 SpringApplication.run,浏览器就能打开页面。

我当时的第一反应不是惊喜,是怀疑——中间那些活,谁替我干了?

这几年带过几个新人,几乎每个人都在同一个地方卡住:会用,但说不清它做了什么。所以这篇把我自己捋明白的顺序写下来。

一、先看没有它的时候,你要写什么

一个能跑的 Servlet 应用,最少需要四样东西:web.xml 里注册 Servlet 和 url-pattern;pom 里手写 spring-webmvc 和 servlet-api 的版本号,还得自己保证两者兼容;一个外置 Tomcat 安装包;以及把 war 塞进 webapps 的部署动作。

这四样里任何一样版本对不上,报错信息通常跟真正的原因隔了三层。NoSuchMethodError 背后可能是两个 jar 里的同一个类,你得靠 mvn dependency:tree 一层层往下翻。

这套流程不是不能用,是每次新建项目都要重来一遍,而且每次重来的成本都花在跟业务无关的地方。

二、起步依赖:真正省事的是版本对齐

spring-boot-starter-web 这个包本身几乎没代码,它只是一串 dependency 声明。你把这一串引进来,Spring 团队已经替你挑好并测过 spring-web、spring-webmvc、jackson、tomcat-embed 之间的兼容版本组合。

这件事的价值不在少写几行 XML。它省掉的是"jackson 2.15 和 spring 6.1 能不能一起用"这类没人愿意回答、但答错就要排查半天的问题。

版本冲突是 Java 生态里最消耗人的一类故障,因为它的表现往往跟原因无关。

三、自动配置不是"猜你想要什么",是"按条件装配"

这是最容易被误解的一块。不少人以为 Spring Boot 会扫描项目、揣摩意图。实际机制朴素得多:它读 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,拿到一长串配置类,每个类头上挂着条件注解,条件满足才生效。

@AutoConfiguration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    // 类路径里有 DataSource、容器里还没有 DataSource Bean 时,这个配置类才装配
}

三个条件,缺一个它就不进来。所以你在 pom 里加个 H2,数据源自动就有了;你手动 @Bean 一个 DataSource,它就主动退让。

官方把这套叫"约定优于配置"。我更愿意叫它"有条件的默认值"——默认值本身不神奇,神奇的是它知道什么时候该闭嘴。

四、内嵌容器:为什么 java -jar 就能跑

外置 Tomcat 的时代,你的代码是客人,容器是主人,启动顺序由容器决定。内嵌 Tomcat 之后,关系反过来了:你的 main 方法是入口,容器只是你 new 出来的一个对象,跟着你的生命周期走。

顺序一反转,很多事就顺了。配置文件能按 profile 加载,健康检查能在容器起来之前注册,优雅停机能在容器关掉之前执行。这些能力在外置模式下不是做不到,是难做——因为你没有那个"启动前"的钩子。

五、它没帮你做的事

这点得说清楚,不然容易踩坑。

连接池参数、事务边界、慢 SQL 监控、健康检查阈值,Spring Boot 只给默认值,不给正确答案。默认的 HikariCP maximumPoolSize 是 10,线上并发一上来就不够用,日志里全是 connection timeout,没有任何提示告诉你该调到多少。

说实话,我上个月就在这上面翻过一次车:一个批量导入接口把连接池占满,主站跟着超时,最后查了半天才发现是默认值的问题。默认值是给你能跑起来用的,不是给你上生产用的。

六、收个尾

Spring Boot 干的事可以压成一句:把"能让程序跑起来的最小配置"变成默认值,把"配错了才在运行时暴露"变成"条件不满足就不装配"。

它省的是搭建成本,不是理解成本。

你越清楚它在背后做了什么,出问题时就越不用靠猜——而这恰恰是新手和老手之间最实际的那条分界线。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。