Web基础-分层解耦

思考:什么是耦合?什么是内聚?软件设计原则是什么?

耦合:衡量软件中各个层 / 各个模块的依赖关联程度。
内聚:软件中各个功能模块内部的功能联系。
软件设计原则:高内聚低耦合。

 那我们该如何实现高内聚低耦合的软件设计原则?

高内聚(自己模块干自己的事)我们已经通过三层架构的方式进行解决了,那么接下来就是如何进行解耦合了。

要对代码进行解耦合首先得知道代码什么地方耦合了?

我们知道在三层架构中controller层要调用service层的服务,所以要在controller层声明service层的对象并进行初始化;同理service层要使用dao层的服务,所以要在service层声明dao层的对象并进行初始化。观察下图我们可以和清晰的观察到三层架构之间的耦合关系。

简单一点就是上层要调用下层的服务,所以要在自己的类里声明并创建下层的对象。


 代码耦合可能会出现的问题。

以controller层为例,由于controller层要调用service层的服务 ,所以要在controller层声明service层的对象并进行初始化,那么一旦serviceImpl的代码有所改变,例如从Impl变为Impl2,那么不光要对service层代码进行改变,同样的还要对controller层进行改变(体现耦合性)。由此代码便很难以维护,因为各个模块之间的耦合性太高,牵一发而动全身。(我只改了service层的代码,但却还要改controller层的代码。)

人话:我只想聚焦我修改的那一个模块,不想改改这,改改那。


 那该如何解决这个问题呢?换句话说,该如何解决模块之间的耦合关系呢?

spring给了我们解决方案:控制反转以及依赖注入

Q:什么是IOC以及DI?(重点)

控制反转: Inversion Of Control,简称IOC对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。

Bean对象:IOC容器中创建、管理的对象,称之为Bean

这两种技术是如何解决模块之间的耦合问题的呢?

 

想理解这个问题我们还是得先聚焦到我们的问题本身。还是这张图,我们发现这两个模块之所以耦合的原因其实是因为我们要手动的去进行对象的创建如果我们一旦对service层代码进行修改那么就会牵一发而动全身。思考一下如何解决这个问题呢?

我们不手动进行创建对象,而是交给第三方管理,一旦我们再对service层代码进行修改,只需要告诉第三方管理我们想要使用哪个修改过的类就好了,(底层交由第三方去管理bean对象的创建)而不是手动的去更改对象创建实体,那么也就不用在修改service层代码之后,再去修改controller层的代码了,那不就解决这个问题了吗。


 sping内部是如何实现对模块进行解耦合的?

上文的第三方管理其实就是我们鼎鼎大名的spring

为了实现上述功能,spring在内部其实会创建一个spring容器,spring会把你选定的bean对象都放在这个bean容器之中,有了这个bean容器,你就不再需要在手动的去进行类的实体化,这个工作将完全交由spring来完成。这就是spring的最核心的一大功能之一控制反转(IOC)(对象的创建控制权由程序自身转移到外部),并且一旦应用程序在运行时需要某个bean的实例化,spring就会自动的为那个类进行实例化,这同样也是spring的最核心的功能之一依赖注入(DI)(容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。) 


 小结: 

1. 实现分层解耦的思路是什么 ?
将项目中的类交给 IOC 容器管理( IOC ,控制反转)
应用程序运行时需要什么对象,直接依赖容器为其提供( DI ,依赖注入)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法题(33):长度最小的子数组

审题: 需要我们找到满足元素之和大于等于target的最小子数组的元素个数,并返回 思路: 核心:子数组共有n种起点,nums数组的每个元素都可以充当子数组的首元素,我们只需要先确定子数组的首元素,然后往后查找满…

网络数据通信基本流程

1.基本概念 网络通信就是发送数据、接收数据、处理数据的过程,发送数据时要读数据进行处理(封装),接收数据时也要对数据进行处理(分用), 1)封装 对数据进行加工处理,如…

科创驱动 | 华望系统科技荣膺西湖区年度前沿创新新锐企业

2025年1月3日,由中共西湖区党委、西湖区人民政府主办的“新年第一会”—西湖区科技创新大会在杭州隆重举行。大会现场揭晓了西湖区年度科技创新团队与项目,并发布了“2024西湖区科技十大事件”与“西湖区五大年度科技榜单”。杭州华望系统科技有限公司榜…

Java Web开发基础:HTML的深度解析与应用

文章目录 前言🌍一.B/S 软件开发架构简述🌍二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 🌍三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…

点亮一个esp32 的led

最近入了一个ESP32 兄弟们,这玩意还可以,买来肯定是给它点亮啊对吧 我就是点灯侠🎇 😭千万不要不接天线啊,不然你会一直找不到你的wifi 1.点灯第一步你得有IDE Arduino 就是这个绿东西 可是怎么下载安装呢&#xff…

CI/CD 流水线

CI/CD 流水线 CI 与 CD 的边界CI 持续集成CD(持续交付/持续部署)自动化流程示例: Jenkins 引入到 CI/CD 流程在本地或服务器上安装 Jenkins。配置 Jenkins 环境流程设计CI 阶段:Jenkins 流水线实现CD 阶段:Jenkins 流水…

HTB:Bastion[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用enum4linux…

Springboot——钉钉(站内)实现登录第三方应用

文章目录 前言准备1、创建钉钉应用,并开放网页应用2、配置网页应用各项参数发布版本 前端改造后端逻辑1、获取应用免登录 Access_token2、通过免登录 Access_token 和 Auth_Code 获取对应登录人信息 注意事项 前言 PC端的钉钉中工作台,增加第三方应用&a…

马斯克的Grok-2 Beta APP在苹果应用商店上限了,Grok-2安装尝鲜使用教程

马斯克的Grok-2 Beta APP 已经上线苹果商城了,移动端的Grok挺好用的!无需登录即可使用! (文末有安装教程) 实测之后,Grok-2 绘画方面个人感觉比GPT-4的绘画还要强一些。而且速度还挺快,可以多次…

深入理解 C 语言中浮点型数据在内存中的存储

文章目录 一、浮点型数据存储格式(IEEE 754 标准)二、举例说明单精度浮点数存储过程三、绘图说明四、双精度浮点数存储示例(以1.5为例) 在 C 语言的世界里,数据类型丰富多样,而浮点型数据用于表示实数&…

hutool糊涂工具通过注解设置excel宽度

import java.lang.annotation.*;Documented Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) public interface ExcelStyle {int width() default 0; }/*** 聊天记录*/ Data public class DialogContentInfo {/**…

自定义日期转换配置

文章目录 1.日期问题出现原因以及解决方案概述1.图示2.三种解决方案概述1.对于表单数据 application/x-www-form-urlencoded2.对于JSON数据1.使用JsonFormat注解2.自定义Jackson日期转换配置 2.解决方案common-web-starter1.目录2.BaseController.java 使用InitBinder解决表单数…

Ubuntu更改内核

需求背景: 由于软件需要在较低版本或者指定版本才可以运行 版本: 配置文件: vi /etc/default/grub 启动界面: 可运行版本: 解决方案: 方案1、更改启动顺序 sudo vi /etc/default/grub 方案2、调整启动顺…

Android系统定制APP开发_如何对应用进行系统签名

前言 当项目开发需要使用系统级别权限或frame层某些api时,普通应用是无法使用的,需要在AndroidManifest中配置sharedUserId: AndroidManifest.xml中的android:sharedUserId“android.uid.system”,代表的意思是和系统相同的uid&a…

解决idea中无法拖动tab标签页的问题

1、按 Ctrl Alt S 打开设置,找到路径 File | Settings | Appearance & Behavior | Appearance 2、去掉勾选 Drag-and-drop with Alt pressed only 即可

【芯片封测学习专栏 -- D2D 和 C2C 之间的区别】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewD2D(Die-to-Die)互联D2D 定义D2D 特点D2D 使用场景 C2C(Chip-to-Chip)互联C2C 定义C2C 特点C2C 使…

SQL美化器优化

文章目录 1.目录2.代码 1.目录 2.代码 package com.sunxiansheng.mybatis.plus.inteceptor;import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.*; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.*…

CC工具箱使用指南:【类Json文本转面要素】

一、简介 有一些面要素是通过Json数据存储的,但有可能在某些转化过后,变成了文本信息存储在字段里,如下截图: 字段值中保存了完整的点坐标信息。 工具要做的是将这点坐标信息提取出来,创建成面要素。 二、工具参数介…

英伟达Project Digits赋能医疗大模型:创新应用与未来展望

英伟达Project Digits赋能医疗大模型:创新应用与未来展望 一、引言 1.1 研究背景与意义 在当今数字化时代,医疗行业作为关乎国计民生的关键领域,正面临着前所未有的挑战与机遇。一方面,传统医疗模式在应对海量医疗数据的处理、复…

力扣 岛屿数量

从某个点找,不断找相邻位置。 题目 岛屿中被“0”隔开后 ,是每一小块状的“1”,本题在问有多少块。可以用dfs进行搜索,遍历每一个点,把每一个点的上下左右做搜索检测,当检测到就标记为“0”表示已访问过&a…