第1课:Spring Boot Hello World
预计时间:30-40 分钟 | 前置:会写 Java 类与注解,装好 JDK 17 和 IDE
@ 注解)还会多一段
④ 规范写法——可直接照抄的最小代码示例。
比如把鼠标放到 CRUD 上试试。每个名词只在第一次出现时带下划线,之后再出现只保留颜色,不再重复弹窗。 全部 69 个名词都记录在 名词速查笔记 GLOSSARY.md(带目录,可搜索)。 答疑和笔记都收在 DSH 笔记文档页。
什么是 Spring Boot?
一句话理解
Spring Boot 是 Spring 框架的「免配置」版本。传统 Spring 项目要写大量 XML 和 Java 配置, 而 Spring Boot 让你开箱即用:加好依赖、写个 main 方法,就能跑起来。
三大核心优势
你加了什么依赖,它就自动帮你配好对应组件。加了 Web 依赖,它就把 Web 服务器和请求分发都准备好。
提供一系列 starter 依赖,每个都打包了一组相关库,版本已经互相匹配好,不用你逐个挑。
内嵌服务器 把 Tomcat 直接打进应用里,不需要单独装服务器、也不需要部署 WAR 包,运行即可。
三条汇成一句:约定先给好,你要改才写。
| 优势 | 一句话 | 它替你省了什么 |
|---|---|---|
| 自动配置 | 加了什么依赖,就自动配好对应组件 | 不再手写 XML 与 Java 配置类 |
| 起步依赖 | 一组相关库打成一包,版本已互相匹配 | 不用逐个挑依赖、不用自己对版本 |
| 内嵌服务器 | Tomcat 直接打进应用里 | 不装服务器、不部署 WAR,运行即可 |
第一步:创建项目
用 Spring Initializr 生成项目骨架,访问 start.spring.io:
- Project: Maven
- Language: Java
- Spring Boot: 4.1.1(你实际用的版本,写 3.x 的老教程不适用)
- Group: com.sutrasky
- Artifact: hello-spring-boot
- Packaging: Jar
- Java: 17
在右侧搜索并添加 Spring Web。
生成到 pom.xml 里的 artifactId 是
spring-boot-starter-webmvc——注意 Spring Boot 4 改了这个名字,
网上大量老教程写的还是 spring-boot-starter-web,照抄会找不到依赖。
点 GENERATE 下载压缩包并解压。本项目解压后落在
code/_hello-spring-boot/hello-spring-boot/(多套了一层同名目录,属正常)。
项目结构解析
用 IDE 打开项目根目录(含 pom.xml 的那一层),你会看到:
- hello-spring-boot/项目根目录
- src/main/java/com/sutrasky/hello_spring_boot/你要写代码的地方
- HelloSpringBootApplication.java应用入口
- HelloController.java第 3 步要写
- src/main/resources/
- static/CSS、JS、图片
- templates/服务端渲染的模板
- application.properties配置文件
- src/test/java/测试代码
- pom.xmlMaven 依赖与构建配置
- mvnw.cmdMaven 包装器(Windows)
- target/构建产物,不用手改
- src/main/java/com/sutrasky/hello_spring_boot/你要写代码的地方
HelloSpringBootApplication.java 是应用入口,含 main 方法;
src/main/java 下就是你要写代码的地方。
核心注解解析
打开 HelloSpringBootApplication.java,你会看到:
package com.sutrasky.hello_spring_boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // ⭐ 核心注解
public class HelloSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(HelloSpringBootApplication.class, args);
}
}
@SpringBootApplication 一个注解,抵得上三个:
@Configuration 标记为配置类
@Configuration 告诉 Spring「这个类里写着怎么造对象」。
@EnableAutoConfiguration 启用自动配置
@EnableAutoConfiguration 打开自动装配开关: 类路径上有什么依赖,就装什么组件。
@ComponentScan 扫描组件
@ComponentScan 让 Spring 去当前包及其子包下, 把该管的类都找出来,登记成由它统一创建和保管的 Bean。
SpringApplication.run(...) 就是启动整台机器。
Spring 启动时会把一批对象创建好、放进容器里统一保管,这些对象就叫 Bean。上面三个注解的分工,正好对应 Bean 从哪来:
- @ComponentScan
- 决定哪些类要变成 Bean
- @Configuration
- 决定手工声明的 Bean 怎么造
- @EnableAutoConfiguration
- 决定缺哪些 Bean 就自动补上
你马上要写的 HelloController 本身就是一个 Bean——它被扫到之后由 Spring 创建,
框架才知道该把 /hello 请求交给它。后面要学的 @Service、
@Repository 和依赖注入,本质上都是在跟 Bean 打交道。
创建你的第一个控制器
现在写一个返回 "Hello World" 的接口。在
src/main/java/com/sutrasky/hello_spring_boot/ 下新建 HelloController.java:
package com.sutrasky.hello_spring_boot;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
@RestController=@Controller+@ResponseBody:方法返回的字符串直接写进 HTTP 响应体,不再去找网页模板。@GetMapping("/hello"):把hello()绑定到 GET/hello这个请求上。
运行应用
在项目根目录(code/_hello-spring-boot/hello-spring-boot)打开终端:
mvnw.cmd spring-boot:run
macOS / Linux 用 ./mvnw spring-boot:run。也可以在 IDE 里直接运行
HelloSpringBootApplication 的 main 方法。
出现下面两行就成功了——注意最后由 端口 8080 提供服务:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v4.1.1)
Tomcat started on port(s): 8080 (http)
Started HelloSpringBootApplication in 2.345 seconds
应用已经跑起来了。下面这些事在启动时都发生过,按真正发生的顺序点一遍:
零 JS 降级:看答案
正确顺序:main → run → scan → bean → tomcat → hello
三个必做的验证
# 验证1:访问 /hello —— 应返回 Hello, Spring Boot!
curl http://localhost:8080/hello
# 验证2:访问一个没写的路径 —— 应返回 404(说明服务器在正常处理请求)
curl -i http://localhost:8080/nope
# 验证3:改一下返回值再刷新页面,确认热重启生效(改完保存,等日志出现 Restarting)
# 把 "Hello, Spring Boot!" 改成 "Hello, <你的名字>"
Port 8080 was already in use,说明 8080 被别的程序占了——
在 application.properties 里加一行 server.port=8081 换端口即可。
.LCKHelloController.java~ 这类文件,那是编辑器留下的锁文件,不是你的代码,删掉它(target/ 里的那份也一并清掉)。
你做到了
- Spring Boot 是什么,为什么它「免配置」
- 用 Spring Initializr 生成项目,并认出 Boot 4 的依赖新名字
- 读懂项目骨架与各个目录的职责
@SpringBootApplication展开后是哪三个注解- 写出第一个
@RestController接口并访问到它
知识检验
推荐阅读(按优先级)
- Spring 官方:Building an Application with Spring Boot —— 本课主参考,官方权威
- Spring Boot 官方参考文档 —— 遇到具体问题时查阅
- 本工作区:Spring Boot 核心注解速查表 —— 本课出现的注解都在里面有表格
课后挑战(做完再往下学)
四道题都写了验收标准——做到「验收」里描述的现象才算过。 卡住就在右下角「有疑问」提交;解答会收在左栏 DSH 笔记卡的答疑栏里,按所属章节分组。
-
路径参数接口——让接口能接住 URL 里的名字
做:在HelloController里加一个方法,路径写成/hello/{name},返回值是Hello, 名字!。 路径里{name}的名字要和参数名一致。
验收:访问http://localhost:8080/hello/张三得到Hello, 张三!;再访问http://localhost:8080/hello(不带名字) 应该得到 404。
提示:用@PathVariable—— 把鼠标放到它上面,小窗第 ④ 段就是可以直接照抄的写法。忘加这个注解会直接 404。 -
返回 JSON——让接口吐出结构化数据
做:再加一个GET /about,返回一段 JSON 字符串, 含course、lesson、author三个字段 (author写你自己的名字)。
验收:浏览器里显示出这段 JSON;再打开开发者工具的 Network 面板,看这个请求的Content-Type—— 它是text/plain,不是application/json。
想一想:为什么?怎么才能让它变成application/json? (第2课讲;你也可以现在就把Map放进去试一次,看区别。) -
改配置就改行为——体会「约定优于配置」的另一面
做:打开src/main/resources/application.properties, 加一行server.port=…,把端口改成8081。 只改这一行配置,Java 代码一个字都不动。
验收:重启后启动日志里出现Tomcat started on port 8081;http://localhost:8081/hello通, 而http://localhost:8080/hello打不开。 -
(进阶)打成 JAR 独立运行——体会「内嵌服务器」
做:先执行mvnw.cmd package;然后在项目外面新建一个空目录, 把target\hello-spring-boot-0.0.1-SNAPSHOT.jar复制进去; 在这个新目录里执行java -jar hello-spring-boot-0.0.1-SNAPSHOT.jar。
验收:新目录里只有那一个 jar——没有src、 没有mvnw、没有 Tomcat;但它照样启动,http://localhost:8080/hello照样能访问。
想一想:什么都没有,它凭什么能跑?答案就是 内嵌服务器——服务器被打包进 jar 里了, 所以不再需要你单独装一个 Tomcat。
做完这四道,第2课的五个接口就长在这套底子上。卡住了把报错贴给我。