当前位置: 首页 > 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.jsqmd.com/news/927633/

相关文章:

  • AI驱动招聘自动化:从简历解析到智能匹配的实战架构与落地
  • openEuler内网yum源搭建实战:用Nginx快速部署,实现团队共享软件包
  • Rust服务端渲染实战:集成Dall.E API构建高性能AI图像生成应用
  • 别再只盯着RabbitMQ和Kafka了:深度解析TongLINKQ的进程模型与高可靠设计
  • 游戏开发避坑指南:用SAT算法搞定Unity/Cocos Creator中复杂3D模型的碰撞检测
  • 拒绝“胡言乱语”:企业级 RAG 应用中如何彻底规避 LLM 幻觉?
  • 电磁场:从库伦定律到高斯公式、静电平衡
  • Windows Terminal配置
  • Instant-NGP里的哈希表魔法:用Python代码拆解多分辨率哈希编码,告别NeRF的‘过平滑’
  • ICML 2024投稿倒计时24天:手把手教你用OpenReview搞定顶会论文提交(附避坑清单)
  • SharePoint 反序列化漏洞拿下 CVSS 8.8 + Windows 内核提权:五月高危漏洞集中爆发,服务器防护还有哪些盲区
  • 告别Resources文件夹!用Unity Addressables 1.19.19管理你的游戏资源,附完整避坑指南
  • 算法入门:递归和尾递归
  • 时空孪生赋能|核电厂区人员安全无感管控
  • AI招聘筛选实战:从GPT-4o到Grok-4的模型选型与评测
  • 仿函数--set/map常用
  • 别再手动改IP了!Windows Server域控服务器IP地址变更的完整流程与避坑指南
  • 《HarmonyOS技术精讲》四:驱动开发入门 ── 标准外设与非标USB串口
  • [特殊字符]️ Agent零信任:Anthropic给企业AI安全画了一张新地图(设计测试 + 最小代理 + Agentic SOAR)
  • 从SEO到AIO:泉州本地企业如何应对生成式搜索带来的流量重构
  • 我花了6年写了14000行Go代码,给电工兄弟做了一个Modbus RTU数据采集工具
  • 7.3.2 Other Technologies, Rambus in Particular
  • 保姆级教程:在VMware里给openEuler虚拟机扩容磁盘,不重启搞定LVM分区
  • 从GMM-HMM到端到端:ASR技术演进、核心挑战与工程实践全解析
  • ICML 2024投稿倒计时24天:手把手教你用Overleaf+Git搞定论文格式与协作(附Latex模板)
  • 理性看待AI热潮:技术边界、应用场景与可持续实践
  • 2023年AR技术趋势:从空间计算、WebAR到产业融合的深度解析
  • 项目介绍 MATLAB实现基于双向门控循环单元(BiGRU))进行锂离子电池健康状态(SOH)的准确估计和剩余使用寿命(RUL)预测(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注
  • 从源码到接口:手把手教你用CMake和VS2019为Gmsh生成专属C++开发包
  • 《HarmonyOS技术精讲》五:实战项目 ── 智能支架助手