Springboot-前后端分离——第三篇(三层架构与控制反转(IOC)-依赖注入(DI)的学习)
本篇主要对Controller+Service+DAO三层结构以及控制反转(IOC)与DI(依赖注入)进行总结。
目录
一、三层架构:
Controller/Service/DAO简介:
二、控制反转(IOC)-依赖注入(DI):
概念介绍:
DOC与DI的引入:
使用注解来实现IOC与DI:
一、三层架构:
前言:
如果将代码都写到一个类中,包括数据访问(解析xml文件)逻辑处理,接收请求,响应数据等功能;这种方式会导致代码非常臃肿,复用性差,并且难以维护,实际开发中,尽量保持单一职责原则,所以要分开进行操作,由此引出三层架构:Controller+Service+DAO;
Controller/Service/DAO简介:
- Controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
- Service:业务逻辑层,处理具体的业务逻辑。
- DAO:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括对数据的增删改查等。
整体的流程如下:
首先客户端发送请求到Controller层,Controller接收请求后,调用Service层进行逻辑处理,Service层需要获取数据所以调用DAO层获取数据,DAO返回数据后Service层进行逻辑处理,返回处理后的数据到Controller层,Controller层响应数据到前端界面;这就是三层架构;
二、控制反转(IOC)-依赖注入(DI):
概念介绍:
先对下面提到的几个概念进行简单的介绍:
- 内聚:软件中各个功能模块内部的功能联系。
- 耦合:衡量软件中各个层或模块之间的依赖、关联程度。
- 软件设计原则:高内聚低耦合。
- 控制反转:Inversion Of Control,简称IOC,对象的创建控制权由程序自身转移到外部容器,这种思想就叫做控制反转。
- 依赖注入:Dependency Injection,简称DI,容器为应用程序提供运行时,所依赖的资源称之为依赖注入。
- Bean对象:IOC容器中创建、管理的对象称之为Bean对象。
DOC与DI的引入:
前面讲了三层架构,如果按照这样的流程来接收前端发送的请求并处理请求,就需要在各个层中定义相应的对象,比如说Controller层调用Service层的方法来获取数据,此时Controller层需要new一个Service对象,所以他们两个耦合程度比较高,如果Service换了名字,Controller层也要改变,所以这种方式有很大的缺陷,同样Service和DAO层也一样的情况;
所谓高内聚,例如service层只对客户这种类型数据进行处理,不对其他类型进行处理;实际开发中软件设计原则是高内聚低耦合,这样当Service代码变化,不需要改变Controller层的代码;
所以为了解决这种缺陷,实现解耦操作,在各个层中不用通过new来创建类的对象,可以采用一个容器,这个容器中存放对应的对象,如果Service层中叫做ServiceA那么此时容器中存放一个ServiceA类型的对象,然后Controller层去容器中寻找这个对象然后从容器中拿到这个对象然后调用相应的方法。如果Service层的名称改为ServiceB,此时就在容器中存放一个ServiceB的对象,然后Controller层去寻找即可,无需更改Controller层的代码。那么如何实现这个容器?——通过IOC与DI来实现。
使用注解来实现IOC与DI:
控制反转(IOC):首先一般用下面三种注解实现控制反转,如果有一个不属于那三类,可以用@Component。利用注解来修饰类,将这个类的对象控制权交给IOC容器管理。

依赖注入(DI):如果想在Controller层中使用Service层的对象,需要在创建的对象前面加上@Autowired注解;
演示如下:
Controller层:通过@Autowired注解实现依赖注入,获取IOC容器中Service层的对象:
@RestController
public class DeptController {@Autowiredprivate DeptService deptService;
Service层:通过@Service注解实现将Service类的对象创建与管理交给IOC容器,这样Controller层就可以从IOC容器中获取此类对象。通过@Autowired注解实现依赖注入,获取IOC容器中DAO层的对象:
@Service
public class DeptLogServiceImpl implements DeptLogService {@Autowiredprivate DeptLogMapper deptLogMapper;
DAO层:注意此处一般使用@Mapper注解,这个注解是mabitas提供的(后续会讲到),上面的@Controller注解等是springboot提供的,功能本质上一致。通过加入@Mapper注解将DAO层的对象创建与管理交给IOC容器,这样Service层就可以从IOC容器中获取此类对象。
@Mapper
public interface DeptLogMapper {
通过以上注解即可实现控制反转与依赖注入。
相关文章:
Springboot-前后端分离——第三篇(三层架构与控制反转(IOC)-依赖注入(DI)的学习)
本篇主要对ControllerServiceDAO三层结构以及控制反转(IOC)与DI(依赖注入)进行总结。 目录 一、三层架构: Controller/Service/DAO简介: 二、控制反转(IOC)-依赖注入(DI): 概念介绍: DOC与…...
Open CASCADE学习|曲面上一点的曲率及切平面
曲率(Curvature)是一个几何学的概念,用于描述一个物体的形状在某一点上的弯曲程度。在我们日常生活中,曲率与我们的生活息息相关,如道路的弯道、建筑物的拱形结构、自然界的山脉等等。了解曲率的概念和计算方法&#x…...
CentOS 8最小安装和网络配置
文章目录 简介下载地址VMware 17创建虚拟机最小化安装拥有的外部命令yum源有问题网络配置开启SSH Server服务关闭防火墙设置host配置JDK环境完整参考 简介 CentOS 8的IOS如果下载DVD版本至少有10G 这里我们直接选择最小安装,因此选择最小系统boot版本 CentOS-8.5.21…...
【代码随想录-链表】环形链表 II
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…...
Redis核心技术与实战【学习笔记】 - 7.Redis GEO类型 - 面向 LBS 应用的数据类型
前言 前面,介绍了 Redis 的 5 大基本数据类型:String、List、Hash、Set、Sorted Set,它们可以满足绝大多数的数据存储需求,但是在面对海里数据统计时,它们的内存开销很大。所以对于一些特殊的场景,它们是无…...
银行数据仓库体系实践(17)--数据应用之营销分析
营销是每个银行业务部门重要的工作任务,银行产品市场竞争激烈,没有好的营销体系是不可能有立足之地,特别是随着互联网金融发展,金融脱媒”已越来越普遍,数字化营销方兴未艾,银行的营销体系近些年也不断发展,…...
Linux一键部署telegraf 实现Grafana Linux 图形展示
influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…...
C/C++ C++入门
个人主页:仍有未知等待探索-CSDN博客 专题分栏:C_仍有未知等待探索的博客-CSDN博客 目录 一、C关键字 二、命名空间 1、区别 1. C语言 编辑 2. C 2、命名空间定义 3、命名空间的使用 三、C输入&输出 四、缺省参数 五、函数重载 六、引用 …...
【后端】乐观锁和悲观锁
前置知识点 锁:一种确保数据安全的机制和手段。 在多个线程修改共享变量时,我们可以对修改操作进行加锁。当多个用户修改表中的同一数据时,我们可以对该行数据进行加锁(行锁)。锁是用于控制多个操作在并发环境下按顺…...
软件工程知识梳理1-可行性研究
目的:确定问题是否值得去解决。就是用最小的代价在尽可能短的时间内确定问题是否能够解决。 可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也即是在较高层次上以较抽象的方式进行系统分析和设计的过程。 考察点:技术可…...
2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码
2024美国大学生数学建模E题财产保险的可持续模型详解思路具体代码 前言 很快啊!啪的一下拿到题目就开始做题!简单介绍一下我自己:博主专注建模五年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建…...
pytorch nearest upsample整数型tensor
在用 torch.nn.Upsample 给分割 label 上采样时报错:RuntimeError: "upsample_nearest2d_out_frame" not implemented for Long。 参考 [1-3],用 [3] 给出的实现。稍微扩展一下,支持 h、w 用不同的 scale factor,并测试…...
MySQL的SQL MODE
目录 举例: --常见SQL mode --mysql8 sql_mode 官方文档 https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html --查看全局的SQL MODE select global.sql_mode; --查看当前会话的SQL MODE select session.sql_mode; --运行时修改全局的SQL mode set gl…...
GO EASY 框架 之 NET 05
目录 1、Overview 2、Agent接口源码 3、收发消息 4、AgentHandle接收函数 5、conns.Conn接口 1、Overview 名称:agent.Agent 网络链接 接口; DESC:网络链接,服务端与客户端通信媒介; 封装:进一步封…...
【教程】谈一谈 IPA 上传到 App Store Connect 的几种方法
【教程】谈一谈 IPA 上传到 App Store Connect 的几种方法 引言 在应用开发过程中,将应用程序上传到 App Store Connect 是一个关键的环节。本文将探讨几种常见的 IPA 文件上传方法,包括 Xcode、Application Loader、altool、Appuploader以及Transport…...
面试经典 150 题 -- 滑动窗口 (总结)
面试经典150题链接 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台 209 . 长度最小的子数组 思路 : 滑动窗口的思想,取ij0,向后遍历j,记录前缀和[l,r]为s,如果s>target,那么左端点向右移动,直到s…...
JDK8对List对象根据属性排序
文章目录 JDK8对List对象根据属性排序1. 被排序字段为null或者空时候报错2. 使用Stream流排序2.1 根据name升序2.2 根据name升序,score降序 3. 使用Collections排序3.1 根据name升序3.2 根据name升序,score降序 4. 完整的demo JDK8对List对象根据属性排序…...
【2024美国大学生数学建模竞赛】2024美赛C题网球运动中的势头,网球教练4.0没人比我更懂这个题了!!!
【2023美国大学生数学建模竞赛】2024美赛C题 问题分析、数学模型、实现代码、完整论文 引言 本人是计算机博士,拥有10年网球球龄,2023年的温网决赛,熬夜到半夜全称观看完了直播,对于网球规则、比赛的数据非常熟悉,这个…...
python的Flask生产环境部署说明照做成功
最近刚好在我的Linux服务器上部署一个Web服务, 使用了python的Flask框架, 因此本文主要介绍flask在linux环境上的部署。 Flask 是一个轻量级的 Python Web 框架,非常适合快速开发小型到中型的 Web 应用。然而,Flask 自带的服务器通常是用于开发目的&…...
EXCEL VBA调用百度api识别身份证
EXCEL VBA调用百度api识别身份证 Sub BC_识别身份证()Dim SHD, SHX As WorksheetDim AppKey, SecretKey, Token, PathY As StringDim jSon, JSonA, WithHttp As ObjectDim Pic, oDom, oW, jsCode, paramsDim ARX, BRX, DRX, ERX, ZADDim StrText, StrUrl As StringDim StrA, S…...
AR.js实战指南:如何在Web浏览器中构建高效增强现实应用
AR.js实战指南:如何在Web浏览器中构建高效增强现实应用 【免费下载链接】AR.js Image tracking, Location Based AR, Marker tracking. All on the Web. 项目地址: https://gitcode.com/gh_mirrors/arj/AR.js 在移动设备普及的今天,增强现实&…...
SIM800L新手避坑指南:从电源不稳到中文短信发送,我的踩坑实录
SIM800L实战避坑手册:从电源设计到中文短信的完整解决方案 第一次拿到SIM800L模块时,我天真地以为这不过是个"高级版蓝牙模块"。直到电源指示灯开始疯狂闪烁、串口不断吐出乱码、中文短信变成问号时,我才意识到自己掉进了技术深坑。…...
OpenClaw版本升级:nanobot镜像迁移全记录
OpenClaw版本升级:nanobot镜像迁移全记录 1. 升级背景与准备工作 去年我在本地部署了基于OpenClaw v1.2的nanobot镜像,这套系统一直稳定运行着我的自动化办公流程。直到上个月收到社区通知,新版本v2.1重构了核心架构,特别是技能…...
OpenClaw排错指南:Qwen3-VL:30B部署常见问题与解决方案
OpenClaw排错指南:Qwen3-VL:30B部署常见问题与解决方案 1. 问题背景与排查准备 上周我在本地部署Qwen3-VL:30B模型并接入OpenClaw时,遇到了不少"坑"。这个号称最强的多模态大模型确实强大,但在私有化部署过程中,从模型…...
Qwen3-TTS部署案例:车载中控系统离线多语种导航语音引擎集成
Qwen3-TTS部署案例:车载中控系统离线多语种导航语音引擎集成 在智能座舱快速演进的今天,车载语音交互已从“能听清”迈向“听得懂、说得好、有温度”的新阶段。传统TTS方案常受限于网络依赖、语种覆盖窄、响应延迟高、方言适配弱等问题,难以…...
“title“: “Java全栈开发面试实录:从基础到实战的深度对话“,
{ "title": "Java全栈开发面试实录:从基础到实战的深度对话", "content": "# Java全栈开发面试实录:从基础到实战的深度对话\n\n## 一、开场白\n\n面试官:你好,欢迎来参加我们公司的Java全栈开…...
OpenClaw成本优化方案:ollama GLM-4.7-Flash自建模型接口实践
OpenClaw成本优化方案:ollama GLM-4.7-Flash自建模型接口实践 1. 为什么需要关注OpenClaw的token消耗问题 第一次用OpenClaw完成自动化周报任务时,我盯着账单倒吸一口凉气——生成三份周报竟然消耗了接近15万token。这让我意识到,如果不解决…...
【2026最新】DirectX Repair修复工具,轻松解决 DirectX 报错、DLL 缺失与游戏闪退问题
游戏打不开、软件报错?别急着重装系统,可能是DirectX和DLL在作怪 “缺少d3dx9_43.dll”、“无法找到X3DAudio1_7.dll”、“应用程序无法启动。。。。。需要的是一个DirectX修复工具。 玩游戏或运行 3D 图形软件时,DirectX 报错是一类常见但又…...
MAX30102血氧传感器避坑指南:如何解决I2C信号干扰问题(附Arduino代码)
MAX30102血氧传感器实战:I2C信号干扰的深度解析与解决方案 当你在深夜调试MAX30102传感器时,突然发现心率数据频繁跳变——这可能是I2C信号干扰在作祟。作为一款高精度光学传感器,MAX30102在医疗级血氧监测和心率检测中表现出色,但…...
UG/NX二次开发必备:C#和C++项目DLL自动签名与拷贝全攻略(附避坑指南)
UG/NX二次开发实战:C#与C项目DLL签名与部署全流程解析 在工业设计软件领域,Siemens NX(原Unigraphics)的二次开发能力一直是工程师扩展功能、提升效率的重要途径。而DLL文件的数字签名环节,则是确保开发成果能在正版NX…...
