第1课:Spring Boot Hello World

课程目标:亲手创建并运行第一个 Spring Boot 应用,理解它为什么被称为「免配置」框架。
预计时间:30-40 分钟 | 前置:会写 Java 类与注解,装好 JDK 17 和 IDE
本课阅读方式: 正文里带彩色虚线下划线的名词,鼠标放上去就会弹出一个小窗, 里面是三段式① 官方定义(正式术语 + 英文全称)→ ② 一句话大白话③ 生活类比; 带用法的名词(比如各种 @ 注解)还会多一段 ④ 规范写法——可直接照抄的最小代码示例。 比如把鼠标放到 CRUD 上试试。
每个名词只在第一次出现时带下划线,之后再出现只保留颜色,不再重复弹窗。 全部 69 个名词都记录在 名词速查笔记 GLOSSARY.md(带目录,可搜索)。 答疑和笔记都收在 DSH 笔记文档页

什么是 Spring Boot?

一句话理解

Spring Boot 是 Spring 框架的「免配置」版本。传统 Spring 项目要写大量 XML 和 Java 配置, 而 Spring Boot 让你开箱即用:加好依赖、写个 main 方法,就能跑起来。

三大核心优势

1 自动配置(Auto-configuration)

你加了什么依赖,它就自动帮你配好对应组件。加了 Web 依赖,它就把 Web 服务器和请求分发都准备好。

2 起步依赖(Starter Dependencies)

提供一系列 starter 依赖,每个都打包了一组相关库,版本已经互相匹配好,不用你逐个挑。

3 内嵌服务器

内嵌服务器 把 Tomcat 直接打进应用里,不需要单独装服务器、也不需要部署 WAR 包,运行即可。

三条汇成一句:约定先给好,你要改才写。

优势一句话它替你省了什么
自动配置加了什么依赖,就自动配好对应组件不再手写 XML 与 Java 配置类
起步依赖一组相关库打成一包,版本已互相匹配不用逐个挑依赖、不用自己对版本
内嵌服务器Tomcat 直接打进应用里不装服务器、不部署 WAR,运行即可

第一步:创建项目

Spring Initializr 生成项目骨架,访问 start.spring.io

1 选择项目配置
2 添加依赖

在右侧搜索并添加 Spring Web

生成到 pom.xml 里的 artifactId 是 spring-boot-starter-webmvc——注意 Spring Boot 4 改了这个名字, 网上大量老教程写的还是 spring-boot-starter-web,照抄会找不到依赖。

3 生成并解压

GENERATE 下载压缩包并解压。本项目解压后落在 code/_hello-spring-boot/hello-spring-boot/(多套了一层同名目录,属正常)。

项目结构解析

用 IDE 打开项目根目录(含 pom.xml 的那一层),你会看到:

关键文件: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 一个注解,抵得上三个:

1 @Configuration 标记为配置类

@Configuration 告诉 Spring「这个类里写着怎么造对象」。

2 @EnableAutoConfiguration 启用自动配置

@EnableAutoConfiguration 打开自动装配开关: 类路径上有什么依赖,就装什么组件。

3 @ComponentScan 扫描组件

@ComponentScan 让 Spring 去当前包及其子包下, 把该管的类都找出来,登记成由它统一创建和保管的 Bean

这就是约定优于配置 三个注解替你定了「配置类在哪、自动配置开不开、去哪个包扫」这些约定,所以你一行配置都不用写。 这行 SpringApplication.run(...) 就是启动整台机器。
顺带认识一个贯穿全课的概念:Bean

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!";
    }
}
两个注解,各司其职:

运行应用

1 启动

在项目根目录(code/_hello-spring-boot/hello-spring-boot)打开终端:

mvnw.cmd spring-boot:run

macOS / Linux 用 ./mvnw spring-boot:run。也可以在 IDE 里直接运行 HelloSpringBootApplication 的 main 方法。

2 看启动日志

出现下面两行就成功了——注意最后由 端口 8080 提供服务:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v4.1.1)

Tomcat started on port(s): 8080 (http)
Started HelloSpringBootApplication in 2.345 seconds
3 测试接口

浏览器打开 http://localhost:8080/hello, 应看到 Hello, Spring Boot!

应用已经跑起来了。下面这些事在启动时都发生过,按真正发生的顺序点一遍:

JVM 调用 main 方法SpringApplication.run(...)@ComponentScan 扫当前包及子包把该管的类创建成 Bean内嵌 Tomcat 启动,监听 8080GET /hello 交给 HelloController

零 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, <你的名字>"
对照检查: 验证2 若返回 404 页面而不是连接失败,说明应用真的在跑;若浏览器打不开、终端报 Port 8080 was already in use,说明 8080 被别的程序占了—— 在 application.properties 里加一行 server.port=8081 换端口即可。
顺手清理:项目源码目录里如果出现 .LCKHelloController.java~ 这类文件,那是编辑器留下的锁文件,不是你的代码,删掉它(target/ 里的那份也一并清掉)。

你做到了

本课你掌握了:

知识检验

问题1:Spring Boot 应用默认运行在哪个端口?
问题2:@RestController 比 @Controller 多做了什么?
问题3:@SpringBootApplication 一个注解,相当于同时做了哪三件事?
问题4:Spring 创建并放进容器统一托管的对象,统称什么?
全部 69 个名词(含前面课程内容)都在 GLOSSARY.md 里,带目录表格,可直接搜索。

推荐阅读(按优先级)

  1. Spring 官方:Building an Application with Spring Boot —— 本课主参考,官方权威
  2. Spring Boot 官方参考文档 —— 遇到具体问题时查阅
  3. 本工作区:Spring Boot 核心注解速查表 —— 本课出现的注解都在里面有表格

课后挑战(做完再往下学)

四道题都写了验收标准——做到「验收」里描述的现象才算过。 卡住就在右下角「有疑问」提交;解答会收在左栏 DSH 笔记卡的答疑栏里,按所属章节分组。

  1. 路径参数接口——让接口能接住 URL 里的名字
    做:HelloController 里加一个方法,路径写成 /hello/{name},返回值是 Hello, 名字!。 路径里 {name} 的名字要和参数名一致。
    验收:访问 http://localhost:8080/hello/张三 得到 Hello, 张三!;再访问 http://localhost:8080/hello(不带名字) 应该得到 404
    提示:@PathVariable—— 把鼠标放到它上面,小窗第 ④ 段就是可以直接照抄的写法。忘加这个注解会直接 404。
  2. 返回 JSON——让接口吐出结构化数据
    做:再加一个 GET /about,返回一段 JSON 字符串, 含 courselessonauthor 三个字段 (author 写你自己的名字)。
    验收:浏览器里显示出这段 JSON;再打开开发者工具的 Network 面板,看这个请求的 Content-Type—— 它是 text/plain不是 application/json
    想一想:为什么?怎么才能让它变成 application/json? (第2课讲;你也可以现在就把 Map 放进去试一次,看区别。)
  3. 改配置就改行为——体会「约定优于配置」的另一面
    做:打开 src/main/resources/application.properties, 加一行 server.port=…,把端口改成 8081只改这一行配置,Java 代码一个字都不动。
    验收:重启后启动日志里出现 Tomcat started on port 8081http://localhost:8081/hello 通, 而 http://localhost:8080/hello 打不开
  4. (进阶)打成 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课的五个接口就长在这套底子上。卡住了把报错贴给我。