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 干的事可以压成一句:把"能让程序跑起来的最小配置"变成默认值,把"配错了才在运行时暴露"变成"条件不满足就不装配"。
它省的是搭建成本,不是理解成本。
你越清楚它在背后做了什么,出问题时就越不用靠猜——而这恰恰是新手和老手之间最实际的那条分界线。
- 点赞
- 收藏
- 关注作者
评论(0)