软件工程实践二:Spring Boot 知识回顾
文章来源说明:
- 作者: [xuan]
- 发布平台: [Xuan’s blog]
- 原链接: https://blog.ybyq.wang/archives/1099.html
- 发布时间: [2025-09-10]
- 转载用途: 仅供学习和技术交流
版权归原作者所有,本文仅做整理和分享之用。
软件工程实践二:Spring Boot 知识回顾
使用 IntelliJ IDEA 创建 Spring Boot Web 项目(仅 Web 依赖)
目标:用 IntelliJ IDEA 快速创建只包含
Spring Web的最小可运行项目,启动后通过浏览器访问http://localhost:8080/api/hello返回 JSON。
一、创建项目(Spring Boot 向导)

步骤说明:
- 打开 IDEA → New Project → 选择 Spring Boot;服务地址保持默认。
- Project Metadata:
- Group:如
com.example - Artifact/Name:如
demo - Packaging:
jar(默认) - Java:
17(或本机已安装的 LTS 版本)
- Group:如
- Build system:
Maven(不要选 Gradle) - Dependencies:搜索并仅勾选
Spring Web。 - Finish → 等待 Maven 下载依赖与索引完成。
提示:若看不到 Spring Boot(Initializr),确保安装了 IntelliJ 的 Spring 插件,或使用
File > New > Project...再选择。
二、项目最小代码示例
1) 主启动类(IDE 已生成,检查包名与类名)
1 | package com.example.demo; |
2) Hello 控制器(新增)
1 | package com.example.demo.controller; |
3) 应用配置(可选)
1 | # src/main/resources/application.yml |
三、运行与验证
- 在
DemoApplication类左侧点击绿色运行箭头,或使用菜单Run。 - 控制台看到
Started DemoApplication ...表示启动成功。 - 浏览器/工具访问:
http://localhost:8080/api/hello- 期望响应示例:
1
{"msg":"hello","time":"2025-01-01T00:00:00Z"}
- 期望响应示例:
常见问题:
- 端口占用:在
application.yml配置server.port: 8081。 - 依赖未下载:检查网络代理或尝试
Reload All Maven Projects。 - JDK 不匹配:
Project Structure > Project/Modules指定与向导一致的 Java 版本。
四、标准目录结构与说明
1 | demo/ ← 工程根目录 |
- DemoApplication:应用入口,
@SpringBootApplication聚合配置并触发自动装配。 - controller:放置
@RestController、@Controller等 Web 层类。 - resources:
application.yml|yaml:端口、数据源、日志级别等配置。static/:静态文件(css/js/img)。templates/:模板引擎(如 Thymeleaf)页面,需相应依赖时使用。
- test:单元/集成测试。
五、Maven 依赖最小示例(仅供参考)
1 |
|
六、常用配置(application.yml 示例)
1 | spring: |
多环境配置(Profiles)示例:
1 | # application-dev.yml(开发环境) |
1 | # application-prod.yml(生产环境) |
运行时指定环境:
1 | spring: |
或启动参数:--spring.profiles.active=prod
全局 CORS(跨域)配置:
1 | package com.example.demo.config; |
全局异常处理:
1 | package com.example.demo.common; |
七、返回 JSON 与统一异常
案例 1:路径参数 + 查询参数 + JSON 返回
1 | package com.example.demo.controller; |
案例 2:触发异常并由全局异常处理返回统一结构
1 |
|
测试命令示例:
1 | # 获取用户(携带查询参数 detail) |
八、@Value 配置读取示例
在 application.yml 定义配置:
1 | app: |
使用 @Value 读取:
1 | package com.example.demo.config; |
说明:
- 默认值语法:
${key:defaultValue},当key不存在时使用defaultValue。 - 类型转换:
Duration/int/boolean等常见类型由 Spring 自动转换(如5s->Duration.ofSeconds(5))。 - 列表索引:
${list[0]}访问第一个元素。 - 建议:若配置项较多/需要分组,优先使用
@ConfigurationProperties进行批量绑定与校验。
九、日志引入与配置(SLF4J + Logback)
- 默认:
spring-boot-starter-logging已内置,提供 SLF4J API + Logback 实现。
1 | package com.example.demo.controller; |
最小 application.yml 配置:
1 | logging: |
常用说明:
logging.level.<包名>:设置指定包日志级别。logging.file.name:直接指定日志文件;或使用logging.file.path指定目录(文件名默认为spring.log)。logging.logback.rollingpolicy.*:文件按大小/历史保留自动滚动。- 自定义输出格式可用:
logging.pattern.console/logging.pattern.file。 - 进阶:切换 Log4j2 需在
pom.xml引入spring-boot-starter-log4j2并排除默认 logging 依赖。
十、@ConfigurationProperties 批量绑定与校验
配置(支持嵌套对象、列表、Map、时长等类型):
1 | app: |
属性类:
1 | package com.example.demo.config; |
启用方式(三选一):
1 | // 推荐:在启动类上开启扫描 |
校验依赖:
1 | <dependency> |
十一、GET 参数处理与示例
GET 适用于通过查询参数与路径变量传递轻量数据;GET 不能上传文件(multipart/form-data)。
1 | package com.example.demo.controller; |
提示:
- GET 不支持文件上传;文件请使用
POST multipart/form-data。 List<String>通过重复 key 传递最稳妥(如?tags=a&tags=b)。Duration在查询参数中推荐使用 ISO-8601 表达(如PT30S、PT5M)。
十二、POST 参数上传与示例
常见 POST 载荷类型:
application/json、application/x-www-form-urlencoded、multipart/form-data、text/plain、application/octet-stream。
1 | package com.example.demo.controller; |
示例请求(curl):
1 | # 1) JSON |
提示:
- 表单数组使用重复 key:
tags=a&tags=b。 - 混合 JSON + 文件时,JSON part 的
Content-Type必须是application/json。 - 大文件上传请调整
spring.servlet.multipart.max-file-size与max-request-size。
十三、过滤器 Filter 与案例
过滤器位于最前层(Servlet 容器级),执行顺序:Filter → Servlet/DispatcherServlet → Interceptor → Controller。
1 | package com.example.demo.filter; |
测试:
1 | # 不带 token 访问受保护的 API(期望 401) |
十四、拦截器 HandlerInterceptor 与案例
拦截器运行在 Spring MVC 层,适合做登录鉴权、上下文注入、审计日志等。顺序:Filter → Interceptor → Controller → 异常处理(Advice)。
日志拦截器:
1 | package com.example.demo.interceptor; |
鉴权拦截器:
1 | package com.example.demo.interceptor; |
注册拦截器:
1 | package com.example.demo.config; |
在控制器中读取拦截器写入的属性:
1 | package com.example.demo.controller; |
测试命令:
1 | # 未带 token(期望 401) |
十五、PUT 参数上传与示例
PUT 常用于”更新”语义,通常与资源标识(如路径变量 id)配合;相较于 POST,PUT 更强调幂等性。
1 | package com.example.demo.controller; |
示例请求(curl):
1 | # 1) JSON |
注意:
- PUT 语义倾向幂等,更新相同资源应返回相同结果;可配合 If-Match/ETag 做并发控制。
- 开启 Spring Security 时,PUT 默认受 CSRF 保护;纯 API 服务可关闭 CSRF。
十六、20 个 GET/POST 接口样例
覆盖探活、版本、分页、详情、搜索、请求头/IP、速率限制、时间时区、登录、下单/支付、上传、表单、文本、数值计算等多样场景。
约定:若启用拦截器/安全,请携带
X-Auth-Token: demo-token。
GET 接口
1) GET /api/sample/ping — 健康探活
1 | curl "http://localhost:8080/api/sample/ping" |
2) GET /api/sample/version — 版本信息
1 | curl "http://localhost:8080/api/sample/version" |
3) GET /api/sample/users — 用户分页(参数:page、size、keyword)
1 | curl "http://localhost:8080/api/sample/users?page=1&size=2&keyword=ali" |
4) GET /api/sample/users/{id} — 用户详情
1 | curl "http://localhost:8080/api/sample/users/1001" |
5) GET /api/sample/search — 关键字+标签搜索
1 | curl "http://localhost:8080/api/sample/search?q=phone&tags=android&tags=5g" |
6) GET /api/sample/headers — 请求头读取
1 | curl -H "X-Trace-Id: abc-123" -H "User-Agent: curl/8.0" \ |
7) GET /api/sample/ip — 客户端 IP/UA
1 | curl -H "User-Agent: demo" "http://localhost:8080/api/sample/ip" |
8) GET /api/sample/rate-limit — 速率限制信息
1 | curl "http://localhost:8080/api/sample/rate-limit" |
9) GET /api/sample/echo — 回显 message
1 | curl "http://localhost:8080/api/sample/echo?message=hello" |
10) GET /api/sample/time — 当前时间(可选时区)
1 | curl "http://localhost:8080/api/sample/time?tz=Asia/Shanghai" |
POST 接口
11) POST /api/sample/users — 创建用户(JSON)
1 | curl -X POST "http://localhost:8080/api/sample/users" \ |
12) POST /api/sample/users/batch — 批量创建(JSON)
1 | curl -X POST "http://localhost:8080/api/sample/users/batch" \ |
13) POST /api/sample/login — 登录(JSON)
1 | curl -X POST "http://localhost:8080/api/sample/login" \ |
14) POST /api/sample/orders — 创建订单(JSON)
1 | curl -X POST "http://localhost:8080/api/sample/orders" \ |
15) POST /api/sample/orders/{id}/pay — 支付订单(JSON)
1 | curl -X POST "http://localhost:8080/api/sample/orders/ORD-1/pay" \ |
16) POST /api/sample/upload — 单文件上传(multipart)
1 | curl -X POST "http://localhost:8080/api/sample/upload" \ |
17) POST /api/sample/uploads — 多文件上传(multipart)
1 | curl -X POST "http://localhost:8080/api/sample/uploads" \ |
18) POST /api/sample/feedback — 文本反馈(text/plain)
1 | curl -X POST "http://localhost:8080/api/sample/feedback" \ |
19) POST /api/sample/submit — 表单提交(x-www-form-urlencoded)
1 | curl -X POST "http://localhost:8080/api/sample/submit" \ |
20) POST /api/sample/compute — 数值计算(JSON)
1 | curl -X POST "http://localhost:8080/api/sample/compute" \ |
完整控制器实现(SampleApiController):
1 | package com.example.demo.controller; |
提示:如启用了拦截器或安全配置,上述接口同样需要按规则携带必要的认证信息(如
X-Auth-Token)才能访问。
- 标题: 软件工程实践二:Spring Boot 知识回顾
- 作者: IsayIsee
- 创建于 : 2026-04-07 15:15:13
- 更新于 : 2026-05-18 14:00:26
- 链接: https://blog.120528.xyz/2026/04/07/62eaa797/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。