后端Web之分层解耦(控制反转IOC-依赖注入DI)

news2024/12/22 0:25:07

目录

1.三层架构

2.IOC-DI引入

3.IOC-DI使用

4.IOC细节

5.DI细节


内聚(Cohesion)和耦合(Coupling)是软件工程中两个重要的概念,它们衡量了软件组件的组织方式和组件之间的相互依赖程度。高内聚性意味着模块内的元素紧密相关,共同协作以完成一个单一、明确定义的任务。低耦合度意味着模块或组件之间的依赖性较低,每个模块可以独立于其他模块进行更改和扩展。

高内聚性通常与低耦合度相辅相成。当模块具有高内聚性时,它通常更加自包含,与其他模块的交互较少,从而降低了耦合度。最好的就是做到解除耦合,对其他模块完全没有依赖。这样修改这一模块的代码,其他模块不用变动。

反之,低内聚性会导致高耦合度。如果模块内的元素执行不相关或松散相关的任务,它们需要依赖其他模块来完成工作,从而增加了耦合度。

1.三层架构

在这个controller中,包含了三个功能,如果要修改其中一个,那么就要同时修改另外两个,这样代码复用性差,并且不利于代码的维护和拓展。

在实际的项目开发中,我们应该尽可能的让每一个接口、类和方法的职责更加单一,也就是每个类只完成一件事。这能够让它们的复杂度降低,并增强可读性。因此,我们采用三层架构去降低耦合度(组件间的依赖程度)。

  • controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
  • service:业务逻辑层,处理具体的业务逻辑。
  • dao:数据访问层(Data Access Object) (持久层),负责数据访问操作,包括数据的增、删、改、查。

根据这三层的功能,把上面的代码分别放到各自的层中。

由于我们可能访问的数据不同,比如文件数据、数据库数据或者别人提供的接口中的数据等,为了能够灵活切换访问数据的方式,我们通过面向接口的方式编写Dao层。

2.IOC-DI引入

上面我们只是降低了耦合度,但没有完全解耦。模块之间依然需要通过调用对象来实现自己的功能。因此我们引入控制反转IoC(Inversion of Control)和依赖注入DI(Dependency Injection)。

  • IoC是一种设计原则,它将对象或程序部分的控制权转移给容器或框架,而在面向对象编程中,经常使用依赖注入作为实现IoC的一种模式。
  • 依赖注入指的是对象的依赖关系由容器在运行期决定,通过动态地将依赖关系注入到组件中来实现

简单来说,IOC是指将对象的创建和控制权转移到外部(容器),对象的控制权由程序本身变成了由容器管理,这种思想就叫做控制反转。而依赖注入就是当应用程序(需要对象)运行时,容器提供这个对象资源供于运行,这就叫做依赖注入

这里当EmpController运行时,它需要empservice对象,此时它不去调用EmpServiceB(或者EmpServiceA/C/D等,如果有更多empservice类的话),而是由IOC容器(也叫做Spring容器)提供这个对象。IOC容器中创建、管理的对象就叫做Bean。

它们使得对象的创建和依赖关系交由IOC容器来管理和注入,从而实现了组件之间的解耦和松耦合。

3.IOC-DI使用

使用非常简单,只需要加上注解@Component就完成了控制反转,加上注解@Autowired(自动装配)就完成了依赖注入。

dao层不需要调用其他两个模块,因此只需要IOC(@Component)即可,Service层需要dao层中的对象,因此需要DI(@Autowired),同时它也提供对象给controller,所以也进行IOC,同理,controller只需要DI就行。

如果需要切换业务层的实现,比如新增一个EmpServiceB,我们只需要将EmpServiceA中的IOC(@Component)注释掉,把IOC放在EmpServiceB中,这样容器中就是B的对象了,controller使用的就是B中的业务逻辑。通过改变注解的方法,我们就可以在不改变任何代码的情况下,更改我们业务逻辑。也就实现了解耦

4.IOC细节

通常,我们不直接使用@Componen注解,spring框架提供另外三个注解,以便于标识bean对象是哪个层中的。

bean对象的名字默认是类名的首字母小写,我们可以通过value属性给bean对象一个名字。

Bean组件扫描:bean的声明范围如果在扫描之外,是不会生效的

5.DI细节

如果EmpServiceA和EmpServiceB中的对象都交给容器管理,会直接报错,告诉我们已经有超过一个EmpService类型了。如果我们非要把两个对象都交给容器呢?有以下三个解决方案。

解决方案:

1.加上@Primary注解告诉IOC这个是首要的bean,只注入这个bean。

2.加上@Qualifier注解,指定我们要注入的bean

3.不使用autowired注解了,使用resource注解指定要注入的bean

1和2的注解是由spring提供的,3注解是jdk提供的。

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

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

相关文章

2024真无线蓝牙耳机怎么选?24年四款性价比畅销爆款机型盘点

2024年,真无线蓝牙耳机的市场依旧竞争激烈,各种品牌和型号如雨后春笋般涌现,面对琳琅满目的选择,2024真无线蓝牙耳机怎么选?消费者在寻找具备高性价比和优秀性能的耳机时往往会感到困惑,那么我将针对大家的…

Nature Medicine | 常规机器学习构建蛋白质组衰老时钟!对于数学基础不好的同学,好好思考一下这种研究模式如何借鉴?

今天给各位老铁们分享一篇于2024年08月08号发表在 Nature Medicine [58.7] 的文章:"Proteomic aging clock predicts mortality and risk of common age-related diseases in diverse populations",蛋白质组衰老时钟可预测不同人群的死亡率和常…

机器学习-卷积神经网络(CNN)

机器学习-卷积神经网络(CNN) 1. 卷积神经网络的基本概念1.1 卷积层(Convolutional Layer)1.1.1 卷积操作1.1.2 特征图(Feature Map) 1.2 激活函数(Activation Function)1.2.1 ReLU&a…

JavaEE从入门到起飞(八) ~ Git

git 概括 Git是一个分布式版本控制工具,主要用于管理开发过程中的源代码文件(Java类、xml文件、html页面等)。 学了git能干什么? 代码回溯 查看历史提交记录并恢复到之前的某个状态。这在发现错误或需要查看特定版本时非常有用。和CtrlZ的区别在于g…

【图机器学习系列】(一)图机器学习简介

微信公众号:leetcode_algos_life,代码随想随记 小红书:412408155 CSDN:https://blog.csdn.net/woai8339?typeblog ,代码随想随记 GitHub: https://github.com/riverind 抖音【暂未开始,计划开始】&#xf…

Qt找不到QSound头文件,头文件QSoundEffect

目录 Qt找不到QSound头文件 CMake qmke 可能版本不同更新&#xff0c; 找不到QSound头文件 Qt找不到QSound头文件 #include <QSound> CMake 可以看一下这篇来自网上的文章 CMake中添加Qt模块的合理方法 - wjbooks - 博客园 (cnblogs.com) qmke 打开.pro文件&am…

Flowise在ubuntu22.04上的安装

之前我写过一篇FastGPT的文章&#xff0c;这里我再介绍另外一个开源的低代码工具&#xff0c;他提供开发人员可定制的LLM编排流程和AI代理。开发 LLM 应用程序通常涉及无数次迭代。Flowise的低代码和拖放式 UI 方法支持快速迭代&#xff0c;帮助您更快地从测试到生产。 推荐它的…

鸿蒙(API 12 Beta3版)【AVSession Kit简介】 音视频播控服务

AVSession Kit&#xff08;Audio & Video Session Kit&#xff0c;音视频播控服务&#xff09;是系统提供的音视频管控服务&#xff0c;用于统一管理系统中所有音视频行为&#xff0c;帮助开发者快速构建音视频统一展示和控制能力。 能力范围 提供音视频统一管控能力&…

Windows Server 域控制服务器安装及相关使用

目录 1.将客户机加入域 2.安装域控制器 3.新建域用户 4.设置用户登录时间&#xff0c;账户过期时间 5.软件分发 ​编辑 6.换壁纸 7.OU与GPO的概念 域为集中控制&#xff0c;拿下域控是拿下目标的关键 以Windows Server 2022为例 1.将客户机加入域 前提&#xff1a;客…

通过调整JVM的默认内存配置来解决内存溢出(‌OutOfMemoryError)‌或栈溢出(‌StackOverflowError)‌等错误

文章目录 引言I 调整JVM的默认堆内存配置java命令启动jar包Tomcat服务器部署java应用引言 问题: org.springframework.web.util.estedServletException: Handlerdispatch failed: nested exception isjava.lang.0utOfMemoryError: Java heap space原因分析: 查询查询平台所…

python 之可视化数据(地形图练习)

一、按要求构建疫情情况数据的地形图 二、代码展示 from pyecharts.charts import Map from pyecharts.options import VisualMapOptsmap Map() data [("北京市" , 994),("上海市" , 199),("湖南省" , 299),("台湾省" , 12),(&qu…

[游戏开发] LuaTable转string存读二进制文件

UE5和Unity通用此方案&#xff0c;只不过读写文件的接口略有不同&#xff0c;lua代码的处理是相同的。 下面两个方法是 LuaTable和字符串互相转换的代码 function XUtils.luaTableToString(tab, sp)sp sp or ""local s ""for k,v in pairs(tab) doif t…

高斯泼溅综合指南

高斯泼溅&#xff08;Gaussian Splatting&#xff09;是一种表示 3D 场景和渲染新视图的方法&#xff0c;在“实时辐射场渲染的 3D 高斯泼溅” 中引入。它可以被认为是 NeRF 类模型的替代品&#xff0c;就像当年的 NeRF 一样&#xff0c;高斯泼溅引发了大量新的研究工作&#x…

Android Kotlin - 通过 URL Scheme 打开应用

在 Android 应用中&#xff0c;可以通过自定义 URL Scheme 或 Deep Links 打开应用。这允许你定义一个自定义的 URL 格式&#xff0c;使得当用户点击包含这个 URL 的链接时&#xff0c;系统可以识别并打开你的 APP。以下是详细的实现步骤和一些注意事项。 1. 配置 AndroidMani…

RISC-V特权架构 - 时钟中断处理

RISC-V特权架构 - 时钟中断处理 1 MTI中断处理1.1 触发中断1.2 查询mie.MTIE与mip.MTIE1.3 若运行在M模式下1.4 若运行在S模式下1.5 若运行在U模式下 2 STI中断处理2.1 触发中断2.2 查询mie.STIE与mip.STIE2.3 若运行在M模式下2.4 若运行在S模式下2.5 若运行在U模式下 3 知识总…

Transformer架构的演进之路探究

1 引言 在2017年的开创性论文《Attention is All You Need&#xff08;注意力就是你所需要的一切&#xff09;》中&#xff0c;Vaswani等人提出了Transformer架构&#xff0c;这不仅在语音识别领域引起了一场革命&#xff0c;也对其他多个领域产生了深远的影响。本文将探讨Tra…

【早鸟优惠券】PostgreSQL 16 专栏优惠券

PostgreSQL 从入门到熟悉&#xff0c;本专栏只能做到从入门到熟悉。本专栏以 Markdown 格式书写&#xff0c;格式精美。有需要的朋友可以看下&#xff0c;使用的版本是 16。本专栏大约 20 万字左右&#xff0c;目前已完成了 18 万多字了。还有两篇&#xff08;事务、性能调优&a…

搭建内网开发环境(一)|基于docker快速部署开发环境

引言 最近因需要搭建一套简易版的纯内网的开发环境&#xff0c;服务器采用 centos8.0&#xff0c;容器化技术采用 docker 使用 docker-compose 进行容器编排。 该系列教程分为两大类&#xff1a; 软件安装和使用&#xff0c;这类是开发环境常用的软件部署和使用&#xff0c;涉…

Vue框架学习笔记-8

Vue中的跨域问题 在Vue项目中遇到跨域问题&#xff0c;通常是因为前端&#xff08;Vue&#xff09;和后端&#xff08;如Node.js, Django, Spring Boot等&#xff09;部署在不同的域名或端口上&#xff0c;浏览器出于安全考虑&#xff0c;会阻止跨域请求。解决Vue中的跨域问题…

获取专项练习

文章目录 1.sun-club-practice-api1.vo构建1.SpecialPracticeVO.java2.SpecialPracticeCategoryVO.java3.SpecialPracticeLabelVO.java 2.SubjectInfoTypeEnum.java 2.sun-club-practice-server1.PracticeSetController.java2.service1.PracticeSetService.java2.PracticeSetSe…