通俗拆解Spring IoC/DI+三层调用全流程|苍穹外卖DAY2
前言学习苍穹外卖第 2 天。今天不满足于 代码能跑就行我决定彻底搞清楚 Spring 最核心的两个概念IoC控制反转和DI依赖注入。然后用一个真实的接口把 Controller → Service → Mapper 的完整调用链走一遍。一、传统方式我自己招人干活想象一下没有 Spring 框架我要开一家餐厅。我是老板Service需要一个切菜工Mapper来干活。我只能自己去招人public class EmployeeServiceImpl { // 我自己负责找和创建这个切菜工 private EmployeeMapper employeeMapper new EmployeeMapperImpl(); public void login() { employeeMapper.getByUsername(...); // 然后才能用他 } }这么做的问题强依赖必须精确知道去哪找切菜工EmployeeMapperImpl实现类变更代码必须修改职责不清既要写业务逻辑又要负责对象创建关注点混乱浪费资源多个 Service 依赖同一个 Mapper需重复创建对象无法复用二、Spring 方式中介公司包办一切Spring 框架开了一家强大的 中介公司学名叫做IoC 容器控制反转容器。核心概念控制反转IoC把 创建对象、管理对象 的控制权从开发者代码交给 Spring 容器依赖注入DI组件需要的依赖对象由容器自动装配进来无需手动 new所有 BeanService/Mapper/Controller 等在程序启动时被容器创建、管理需要依赖时容器自动注入实现别找我我会找你的设计哲学。三、代码里的体现Service // 1. 注册为Bean交给Spring管理 public class EmployeeServiceImpl { Autowired // 2. 声明依赖容器自动注入 private EmployeeMapper employeeMapper; // 3. 无需手动创建直接使用 public void login() { employeeMapper.getByUsername(...); // 4. 直接调用 } }流程拆解扫描注册Spring 启动扫描 Service/Mapper创建实例存入 IoC 容器依赖注入创建 EmployeeServiceImpl 时发现 Autowired从容器中取出 EmployeeMapper 注入使用对象属性直接可用全局单例节约资源便于管理四、为什么要用 IoC/DI核心价值解耦只依赖接口不依赖具体实现类替换实现类时业务代码无需修改统一管理对象生命周期支持单例 / 多例等策略一句话总结控制反转IoC交出对象创建与管理的控制权依赖注入DI需要的依赖框架自动送过来五、实战启用 / 禁用员工完整调用链以启用 / 禁用员工功能为例打通三层调用全流程。需求管理员点击禁用按钮将员工账号状态改为停用0。前端请求POST /admin/employee/status/0?id3含义ID3 的员工状态设为 0禁用第一棒Controller 层接待员负责接收请求、参数解析、调用 Service、返回统一结果// EmployeeController.java PostMapping(/status/{status}) ApiOperation(启用禁用员工账号) public Result startOrStop(PathVariable Integer status, Long id) { log.info(启用禁用员工账号{},{}, status, id); employeeService.startOrStop(status, id); return Result.success(); }解析 URL 路径参数status与请求参数id不处理业务直接转发给 Service封装 Result 返回前端第二棒Service 层业务处理层负责业务逻辑编排、数据组装// EmployeeServiceImpl.java Override public void startOrStop(Integer status, Long id) { // 组装要更新的数据 Employee employee Employee.builder() .status(status) .id(id) .updateTime(LocalDateTime.now()) .updateUser(BaseContext.getCurrentId()) .build(); // 交给Mapper执行 employeeMapper.update(employee); }踩坑记录// 错误写法build()返回新对象未接收传入空对象 Employee employee new Employee(); Employee.builder().status(status).id(id).build(); employeeMapper.update(employee); // SQL条件idnull✅ 正确写法用变量接收builder().build()返回的对象第三棒Mapper 层数据访问层Mapper 接口// EmployeeMapper.java Mapper public interface EmployeeMapper { void update(Employee employee); }XML SQL 映射EmployeeMapper.xml -- update idupdate parameterTypeEmployee update employee name ! nullname #{name}, username ! nullusername #{username}, password ! nullpassword #{password}, phone ! nullphone #{phone}, sex ! nullsex #{sex}, idNumber ! nullid_number #{idNumber}, ! nullupdate_time #{updateTime}, updateUser ! nullupdate_user #{updateUser}, nullstatus #{status}, id #{id} /updateMyBatis 执行流程根据接口 方法名匹配 SQL 模板解析动态拼接 SQL替换#{}占位符生成可执行 SQL执行并返回结果最终执行 SQLupdate employee set status 0, update_time 2026-08-01..., update_user 1 where id 3结果返回链路数据库更新成功 → Mapper 返回 void → Service 返回 void → Controller 封装 Result.success() → 前端收到 {code: 1, msg: 操作成功}六、完整调用链路图前端 HTTP 请求 ↓ Controller 层接收请求、参数解析 | 数据形态零散参数 → 传给Service ↓ Service 层业务编排、对象组装 | 数据形态零散参数 → Employee实体 ↓ Mapper 层SQL生成、数据操作 | 数据形态实体 → 执行SQL ↓ 数据库执行 ↓ 结果层层返回 → Controller封装 → 前端响应结尾今天终于搞懂了IoC/DI看课的时候一直云里雾里感觉跟着敲完啥都没学到打通了Controller→Service→Mapper三层调用全流程终于是觉得学到东西了。如果你也在学 Spring希望这篇博客能帮你把 IoC、DI 和三层调用链彻底吃透 欢迎评论区交流一起进步

相关新闻

【信息科学与工程学】【数据中心】计算机科学与自动化——第三百零五篇 数据中心 Scale-Up、Scale-Out、Scale-Across101 芯片接入数据中心121

【信息科学与工程学】【数据中心】计算机科学与自动化——第三百零五篇 数据中心 Scale-Up、Scale-Out、Scale-Across101 芯片接入数据中心121

一、Scale-Up / Scale-Out / Scale-Across 三维定义与边界 维度 物理范围 通信语义 时延量级 典型技术 关键芯片/模块 Scale-Up​ Tray / Rack / Row (<500m) Load-Store(内存语义) ns 级 NVLink / NVSwitch / UALink / SUE NVLink 6 收发器、NVSwitch 6、200G…

2026/8/2 2:57:46阅读更多 →
学术论文审稿意见回复全攻略:从心态到实战技巧

学术论文审稿意见回复全攻略:从心态到实战技巧

1. 从“收到审稿意见”到“提交回复信”&#xff1a;一个完整的心理与技术准备收到审稿意见的那一刻&#xff0c;心情总是复杂的。一方面&#xff0c;这意味着你的工作得到了同行的关注和审阅&#xff0c;是学术交流的重要一步&#xff1b;另一方面&#xff0c;那些密密麻麻的修…

2026/8/2 2:57:46阅读更多 →
langgraph教程系列-06-让流程可暂停 - 持久化与 checkpoint

langgraph教程系列-06-让流程可暂停 - 持久化与 checkpoint

本文是「LangGraph 教程系列」第 6 篇。写作时基于 langgraph 1.2.10、langchain 1.3.14、langchain-openai 1.4.1、Python 3.12。配套代码仓库 https://github.com/wxj006007/deep-research-assistant &#xff0c;本篇对应 tag v2。上一篇 v1.1 让研究助手能真上网查了&#…

2026/8/2 2:57:46阅读更多 →
云手机设备环境隔离技术解析——以QTphone ARM原生架构为例

云手机设备环境隔离技术解析——以QTphone ARM原生架构为例

在出海应用测试、社交媒体矩阵运营及移动端自动化等场景中&#xff0c;多账号环境隔离是规避平台风控关联检测的核心前提。传统x86模拟器因底层架构差异&#xff0c;难以提供真实的硬件指纹与环境参数&#xff0c;极易被风控系统识别。本文以QTphone云手机为例&#xff0c;从AR…

2026/8/2 13:26:19阅读更多 →
VisualCppRedist AIO终极指南:一次性解决所有Windows应用程序运行库问题

VisualCppRedist AIO终极指南:一次性解决所有Windows应用程序运行库问题

VisualCppRedist AIO终极指南&#xff1a;一次性解决所有Windows应用程序运行库问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经因为"MSVCP1…

2026/8/2 13:26:19阅读更多 →
Excel性能优化与系统化问题解决框架:从读取瓶颈到数据管理

Excel性能优化与系统化问题解决框架:从读取瓶颈到数据管理

1. 项目概述&#xff1a;从“问题”到“系统化解决” 干了这么多年数据分析&#xff0c;我敢说&#xff0c;90%以上的人对Excel的认知&#xff0c;都停留在“会用”和“精通”之间那片巨大的灰色地带。你可能会用VLOOKUP&#xff0c;知道透视表&#xff0c;甚至写过几个宏&…

2026/8/2 13:26:19阅读更多 →
5分钟搞定学术海报:Paper2Poster终极指南与完整工作流解析

5分钟搞定学术海报:Paper2Poster终极指南与完整工作流解析

5分钟搞定学术海报&#xff1a;Paper2Poster终极指南与完整工作流解析 【免费下载链接】Paper2Poster [NeurIPS 2025] Open-source Multi-agent Poster Generation from Papers 项目地址: https://gitcode.com/gh_mirrors/pa/Paper2Poster 还在为学术会议的海报制作而烦…

2026/8/2 13:26:19阅读更多 →
软件工程毕设易上手课题帮助

软件工程毕设易上手课题帮助

1 引言 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满足实际应用需求&#xff…

2026/8/2 13:26:19阅读更多 →
数组从入门到精通:内存布局、核心操作与动态数组实战

数组从入门到精通:内存布局、核心操作与动态数组实战

1. 从“闯关”到“精通”&#xff1a;为什么数组实验值得你投入时间 最近在技术社区和在线学习平台上&#xff0c;看到不少朋友在讨论“头歌”这类在线实验平台的数组闯关题目。从热搜词里也能感受到大家的热情和困惑&#xff1a;从基础的“C语言数组和指针”、“数组常用方法”…

2026/8/2 13:24:19阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起&#xff1a;为什么我们需要互相关几年前&#xff0c;我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号&#xff0c;理论上它们接收到的声音波形应该非常相似&#xff0c;只是由于麦克风位置不同&#xff…

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束&#xff0c;将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页&#xff1a;Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起&#xff1a;为什么我们需要互相关几年前&#xff0c;我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号&#xff0c;理论上它们接收到的声音波形应该非常相似&#xff0c;只是由于麦克风位置不同&#xff…

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束&#xff0c;将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页&#xff1a;Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南&#xff1a;如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域&#xff0c;视频编辑处理的质量损…

2026/8/2 1:29:34阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时&#xff0c;光是文献检索就花了整整两周时间&#xff0c;打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化&#xff0c;合理使用这些工具可以节省80%以…

2026/8/2 2:32:55阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统&#xff1a;从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票&#xff0c;支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/2 2:09:20阅读更多 →