当前位置: 首页 > news >正文

Spring Boot 从零入门:请求响应、三层架构与 IOC/DI 实践总结

Spring Boot 从零入门:请求响应、三层架构与 IOC/DI 实践总结

文章目录

  • Spring Boot 从零入门:请求响应、三层架构与 IOC/DI 实践总结
    • 1. 项目搭建与第一个接口
    • 2. 请求响应:参数接收全解析
      • 2.1 哪些参数必须掌握?
      • 2.2 不用 Postman,如何高效测试?
      • 2.3 常见参数示例代码
    • 4. 分层解耦:三层架构设计
      • 4.1 为什么需要分层?
      • 4.2 标准三层职责
    • 5. IoC + DI:彻底告别 `new` 关键字
      • 5.1 IoC 与 DI 概念
      • 5.2 注解驱动的改造步骤
      • 5.3 为什么推荐构造器注入?
    • 6. 统一响应格式(Result 封装)
    • 7. 总结和最后的话

1. 项目搭建与第一个接口

使用 IDEA 的 Spring Initializr 创建项目,依赖仅选择Spring Web
启动类HttpStuApplication自动生成。在controller包下创建HelloController

@RestControllerpublicclassHelloController{@RequestMapping("/hello")publicStringsayHello(){return"Hello, 请求响应学习开始!";}}

运行后浏览器访问http://localhost:8080/hello,输出文本 —— 标志着环境验证通过。


2. 请求响应:参数接收全解析

2.1 哪些参数必须掌握?

优先级参数类型注解使用频率
🔥 必须掌握简单参数@RequestParam(可省略)每天
🔥 必须掌握路径参数@PathVariable每天
🔥 必须掌握JSON 参数@RequestBody每天
✅ 常用实体参数无注解,自动封装经常
⚠️ 了解即可日期参数@DateTimeFormat偶尔
⚠️ 了解即可数组/集合参数@RequestParam+List偶尔

2.2 不用 Postman,如何高效测试?

IDEA 内置 HTTP Client:在项目根目录re新建test.http文件,写入请求,点击绿色箭头即可发送。

示例(JSON 参数测试):

POST http://localhost:8080/json Content-Type: application/json { "name": "张三", "age": 18 }

这种方法零安装、可保存、支持团队共享,非常适合学习阶段。

2.3 常见参数示例代码

@RestControllerpublicclassParamController{// 简单参数@GetMapping("/simple")publicStringsimple(@RequestParamStringname,Integerage){...}// 路径参数@GetMapping("/path/{id}")publicStringpath(@PathVariableIntegerid){...}// JSON 参数@PostMapping("/json")publicUserjson(@RequestBodyUseruser){...}// 实体参数(自动封装)@GetMapping("/user")publicUseruser(Useruser){returnuser;}}

注意:返回类型为String时 Spring 输出纯文本;返回对象/集合/Map 时自动转为 JSON。


4. 分层解耦:三层架构设计

4.1 为什么需要分层?

最初将所有代码写在 Controller 中,导致:

  • 重复代码(多个接口都要查用户)
  • 业务逻辑和请求处理混在一起
  • 更换数据源(例如从 Map 改为 MySQL)需要改动多处

4.2 标准三层职责

层级包名示例职责对象类型
表示层controller接收请求、参数校验、返回响应XxxController
业务层service业务逻辑、事务管理、调用 DAOXxxService+XxxServiceImpl
数据访问层dao/repository数据库 CRUD、模拟数据XxxDao+XxxDaoImpl

调用链
ControllerServiceDAO→ 数据 → 原路返回。


5. IoC + DI:彻底告别new关键字

5.1 IoC 与 DI 概念

概念含义比喻
IoC(控制反转)对象的创建控制权从程序员反转到 Spring 容器你不必自己new,告诉容器“我需要什么”即可
DI(依赖注入)容器在创建对象时,自动将依赖的对象赋值给字段容器帮你“接线”

5.2 注解驱动的改造步骤

原代码(耦合):

publicclassUserServiceImplimplementsUserService{privateUserDaouserDao=newUserDaoImpl();// 主动 new}

改造后(解耦):

@ServicepublicclassUserServiceImplimplementsUserService{privatefinalUserDaouserDao;@Autowired// Spring 4.3+ 单构造器可省略publicUserServiceImpl(UserDaouserDao){this.userDao=userDao;}}

同时为UserDaoImpl添加@Repository,为UserController中注入UserService

5.3 为什么推荐构造器注入?

注入方式代码量不可变性 (final)单元测试循环依赖检测推荐度
字段注入最少困难(需反射)容器内可能掩盖❌ 不推荐
Setter 注入中等一般⚠️ 可选
构造器注入稍多简单new传参启动时报错强烈推荐

构造器注入让依赖显式化、对象不可变、测试更友好。


6. 统一响应格式(Result 封装)

企业级接口通常不直接返回实体对象,而是返回统一结构的 JSON,方便前端全局拦截。

标准结构

{"code":1,"msg":"success","data":{"name":"张三","age":18}}

实现:创建utils/Result

publicclassResult{privateIntegercode;privateStringmsg;privateObjectdata;publicstaticResultsuccess(Objectdata){Resultr=newResult();r.setCode(1);r.setMsg("success");r.setData(data);returnr;}publicstaticResulterror(Stringmsg){Resultr=newResult();r.setCode(0);r.setMsg(msg);returnr;}// getter / setter 必须存在}

Controller 使用

@GetMapping("/user/{id}")publicResultgetUser(@PathVariableIntegerid){Useruser=userService.getUserById(id);if(user==null){returnResult.error("用户不存在");}returnResult.success(user);}

注意:Result 类必须有 getter/setter,否则 Spring 无法将字段序列化为 JSON。


7. 总结和最后的话

主题关键点
请求响应@RequestParam@PathVariable@RequestBody;测试用.http
三层架构Controller(请求/响应)、Service(业务)、DAO(数据)
面向接口编程接口定义契约,实现类可替换,上层只依赖接口
IoC/DI@Service/@Repository+@Autowired;推荐构造器注入
统一响应Result封装 code/msg/data,提供静态工厂方法
http://www.zskr.cn/news/1438964.html

相关文章:

  • openEuler内网yum源搭建实战:用Nginx快速部署,实现团队共享软件包
  • Rust服务端渲染实战:集成Dall.E API构建高性能AI图像生成应用
  • 拒绝“胡言乱语”:企业级 RAG 应用中如何彻底规避 LLM 幻觉?
  • SharePoint 反序列化漏洞拿下 CVSS 8.8 + Windows 内核提权:五月高危漏洞集中爆发,服务器防护还有哪些盲区
  • 告别Resources文件夹!用Unity Addressables 1.19.19管理你的游戏资源,附完整避坑指南
  • 算法入门:递归和尾递归
  • [特殊字符]️ Agent零信任:Anthropic给企业AI安全画了一张新地图(设计测试 + 最小代理 + Agentic SOAR)
  • 从SEO到AIO:泉州本地企业如何应对生成式搜索带来的流量重构
  • 用鲸鱼算法自动调SVM参数的Python完整实现(带数据+可视化)
  • 基于文本补偿与原型增强的增量学习任务路由机制
  • 别再只算准确率了!用Python手撸DCG/IDCG/nDCG,给你的推荐系统做个‘CT检查’
  • SpringBoot项目里时间传参总乱套?手把手教你用@JsonFormat和@DateTimeFormat搞定前后端日期格式
  • 从Verilog到布线:你的代码是如何‘塞’进FPGA里LUT的?一个综合过程的完整拆解
  • 开源能源监测系统助力住宅供暖转型
  • 告别Log混乱!用CAPL的setLogFileName函数实现自动化测试日志的精准归档
  • 别再只用YOLOv8做检测了!手把手教你集成BotSORT实现足球比赛球员轨迹跟踪
  • 全域可视可控|核电外来人员无感安防新架构
  • 实测对比:YOLOv8n与YOLOv8m在Jetson Orin Nano上的训练速度与内存占用(附解决Killed报错方法)
  • Java程序设计(第3版)第四章——错误:未初始化变量
  • 从434个自动化故事构建知识体系:DevOps、RPA与工业自动化的实践指南
  • 为什么yolov8部署在rdkx5上之后检测不到结果
  • 人形机器人技术架构解析:从感知到执行的AI闭环与挑战
  • Java Programming Chapter 4——Error: Variable not initialized.
  • 超越总收入差距:用Dagum基尼分解分析区域发展不平衡(Python实战)
  • 从‘空转’到‘满血’:实战解决TensorFlow/PyTorch训练时GPU功率低Util高的坑
  • Cortex-A9 ACP接口ARUSERS与AWUSERS信号解析
  • 2026年咸阳市黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 盛世金银回收
  • 2026年湘潭市黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 盛世金银回收
  • HPC构建系统:GPU加速与并行编程优化指南
  • 别再踩坑了!STM32H7的MPU内存属性配置详解(附DMA与Cache协作最佳实践)