JavaEE 环境与程序设计 · 交互课程
技术演进接力链(M1 → M9)
  1. 1WEB 基础
    HTTP / Browser / WebServer
    静态页面写死,人人看到一样
  2. 2Servlet
    手写 if-else 分发不可扩展,无生命周期/并发管理
  3. 3JSP:参数散字符串
    参数散成一堆 String,取值靠字段名硬记
  4. 3JSP:scriptlet 塞逻辑
    scriptlet 把逻辑塞进页面,代码与 HTML 糊在一起
  5. 3JavaBean:数据对象化
    对象全靠 new、层层硬依赖
  6. 4Spring IoC
    Web 路由仍手写 web.xml/if-else、手动取参绑定,展示/业务/数据访问没分开
  7. 5MVC · SpringMVC
    数据在库里,访问是重复样板 + 拼串有注入风险
  8. 6MySQL
    Java 连库要手写五步,连接与资源管理全手动
  9. 7JDBC
    SQL 与 Java 混写、结果集逐行手映射、没有动态 SQL
  10. 8MyBatis
    四份配置 + web.xml 装配繁琐,部署要外部 Tomcat
  11. 9SpringBoot
    链尾 · 不考核

SpringBoot

承接上一章的死结
上一章(MyBatis)的死结:四份配置 + web.xml 装配繁琐、部署要外部 Tomcat。本章用「约定大于配置」一次性解掉。

SpringBoot

目标:理解 Boot「约定大于配置」——从 M8(MyBatis)章末死结「四份配置 + web.xml 装配繁琐,部署要外部 Tomcat」出发,掌握 starter 依赖机制、自动配置原理(对照 SSM 四配置文件逐项省掉什么)、内嵌 Tomcat 与 java -jar 单文件部署。

⚠️ 考核范围:本章为技术演进接力链的收口章,不纳入期中/期末考核范围——随堂测验仅用于巩固理解。

一、为什么需要 Boot:M8 章末死结

到 M8(MyBatis)为止,一个能跑起来的 SSM 工程要维护四份配置文件:

配置文件职责
spring.xml组件扫描 + DataSource + 声明式事务
spring-mvc.xmlDispatcherServlet + 注解驱动 + 视图解析器
mybatis-config.xmlSqlSessionFactory + Mapper 扫描
web.xml容器级组件(DispatcherServlet、Filter、监听器)

问题有两层:

SpringBoot 的解法一句话:约定大于配置(convention over configuration)——把「这套东西通常怎么配」固化成自动配置类,你只需给最少的输入,其余它替你补全。

二、starter 依赖机制

传统 Spring 工程要逐个引入 spring-core、spring-webmvc、mybatis-spring……版本还要自己对齐。Boot 用 starter 把「某类能力所需的一组依赖」打包成一个坐标:

好处:你只声明「我要做 Web」「我要用 MyBatis」,依赖版本由 Boot BOM 统一托管,不再手工对齐——引一个 starter = 拿到一整套开箱即用的能力。

三、自动配置原理:对照 SSM 四配置逐项省掉什么

Boot 的核心是 @SpringBootApplication(= @Configuration + @EnableAutoConfiguration + @ComponentScan)。启动时它按「类路径上有什么依赖」去匹配 自动配置类,逐项替你把 SSM 里手写的装配补上。下面这个交互组件把四份配置的对应关系摆在一起,点左侧文件看右侧 Boot 怎么省掉它:

SSM:手写装配(4 份配置 + web.xml)

SpringBoot:自动配置(对照省掉什么)

SSM 里干了什么

组件扫描(<context:component-scan>)+ DataSource + 声明式事务(<tx:annotation-driven>)

Boot 对应机制

自动配置:组件扫描 + 数据源 + 声明式事务,一并就绪

关键自动配置类 / starter

@SpringBootApplication(内含 @ComponentScan)· DataSourceAutoConfiguration · TransactionAutoConfiguration

✓ 省掉:不用手写 <context:component-scan>、<bean id="dataSource">、<tx:annotation-driven>

一句话:Boot = SSM 的「全自动档」——四份手写配置逐项交给自动配置类,部署从外部 Tomcat 变成内嵌容器 + java -jar。

记忆锚点:spring.xml → 组件扫描/数据源/事务自动配置;spring-mvc.xml → WebMvcAutoConfiguration;mybatis-config.xml → MybatisAutoConfiguration;web.xml → 内嵌容器直接省掉。

四、内嵌 Tomcat + java -jar 单文件部署

SSM 时代要「打 war → 丢进外部 Tomcat」。Boot 把 Tomcat 内嵌进 jar:应用启动时自己拉起一个 Servlet 容器,不再依赖外部安装。于是部署退化成一条命令:

mvn clean package            # 打出可执行 fat-jar
java -jar app.jar            # 直接跑,自带 Tomcat,默认 8081(本课程约定端口)

对照:SSM 部署 = 外部 Tomcat + war;Boot 部署 = java -jar 单文件。环境一致性由 jar 自身保证,「在我机器上能跑」的问题被消解。

五、最小工程走查:SimpleSpringBoot

一个最小的 Boot Web 工程只有三样东西:一个 @SpringBootApplication 主类(带 main)、一个 @RestController、一份 application.properties(配数据源/端口)。没有 web.xml、没有四份 XML。下面用 CodePlayground 跑一段纯 Java 片段,体会「主类即入口、启动即拉起容器」的最小形态:

交互实验:浏览器里编译运行 Java(CodePlayground)

未连接

左边写 Java,点「运行」——源码经 WebSocket+STOMP 发给后端(端口 8081),真实javac编译 + java 运行,输出推回你的浏览器。先选一个预置程序试试:

Main.java(可编辑)6 行 · 0.2 KiB / 64 KiB
结果

← 点「运行」看编译/运行结果

💡 最小可运行程序:UTF-8 中文输出 + 表达式求值。

幕后流程:浏览器 →(WebSocket ws://<host>:8081/ws)→ 后端 STOMP /app/run → 沙箱编译运行 → 结果推回你的会话专属队列 /queue/result-<你的id>。每个浏览器标签页只收自己的结果,互不串台。

一句话收束:Boot = SSM 的「全自动档」。它不是新框架,而是把 Spring + SpringMVC + MyBatis 的手写装配自动化了——你学过的 M4/M5/M8 一个都没废,只是配置被自动配置类接管。

思考题

  1. 「四份配置 + web.xml」的痛点具体是什么?Boot 分别用哪个机制省掉它们?
  2. starter 相比逐个引依赖,解决了哪两个麻烦(版本对齐 / 依赖爆炸)?
  3. 内嵌 Tomcat 让部署方式从什么变成什么?为什么这能解决「环境不一致」?
  4. @SpringBootApplication 由哪三个注解合成?各自负责什么?
  5. 为什么说 Boot 不是「新框架」而是 SSM 的「全自动档」?

学习小测验(仅随堂,不入期中/期末卷)

学习小测验

Q1

SpringBoot 引入 spring-boot-starter-web 后,会自动带入什么?

Q2

SSM 里 spring.xml 负责的「组件扫描 + 数据源 + 声明式事务」,在 Boot 中对应( )

Q3

SSM 里 spring-mvc.xml 装配 DispatcherServlet 与注解驱动,Boot 中由谁完成?

Q4

SSM 里 mybatis-config.xml 配置 SqlSessionFactory,Boot 中由谁完成?

Q5

SSM 需要 web.xml 声明 DispatcherServlet/Filter 并依赖外部 Tomcat;Boot 里 web.xml 被省掉的原因是( )

Q6

相比 SSM「打 war 丢进外部 Tomcat」,Boot 的典型部署方式是( )

Q7

对 SpringBoot 最准确的定位是( )

链尾 / 收束
接力链到此收束:SpringBoot 用自动配置 + 内嵌容器把前面所有死结一次性解掉。本章为链尾,不纳入期中/期末考核。