【JavaEE进阶】 关于应用分层
文章目录
- 🎋序言
 - 🍃什么是应⽤分层
 - 🎍为什么需要应⽤分层
 - 🍀如何分层(三层架构)
 - 🎄MVC和三层架构的区别和联系
 - 🌳什么是高内聚低耦合
 - ⭕总结
 
🎋序言
在我们进行项目开发时我们如果一股脑将所有代码都放在一个文件夹下面,或者全部写在一起。这样会显得杂乱无章,而且更加不利于管理。
类似公司的组织架构: 公司初创阶段,⼀个⼈⾝兼数职,既做财务,⼜做⼈事,还有⾏政.随着公司的逐渐壮⼤,会把岗位进⾏细分,划分为财务部⻔,⼈事部⻔,⾏政部⻔等.各个部⻔内部还会再进⾏细分.
项⽬开发也是类似,最开始功能简单时,我们前后端放在⼀起开发,随着项⽬功能的复杂,我们分为前端和后端不同的团队,甚⾄更细粒度的团队.后端开发也会根据功能再进⾏细分.MVC就是其中的⼀种拆分⽅式.
但是随着后端⼈员不再涉及前端,后端开发⼜有了新的分层⽅式
比如在阿里开发⼿册中,关于⼯程结构部分,定义了常⻅⼯程的应⽤分层结构:
 
🍃什么是应⽤分层
应⽤分层是⼀种软件开发设计思想,它将应⽤程序分成N个层次,这N个层次分别负责各⾃的职责,多个层次之间协同提供完整的功能.根据项⽬的复杂度,把项⽬分成三层,四层或者更多层.常⻅的MVC设计模式,就是应⽤分层的⼀种具体体现
🎍为什么需要应⽤分层
在最开始的时候,为了让项⽬快速上线,我们通常是不考虑分层的.但是随着业务越来越复杂,⼤量的代码混在⼀起,会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动⼀处就牵⼀发⽽动全⾝等问题.所以学习对项⽬进⾏分层就是我们程序员的必修课了
🍀如何分层(三层架构)
博主在前面博客中提到的MVC,就是把整体的系统分成了Model(模型),View(视图)和Controller(控制器)三个层次,也就是将⽤⼾视图和业务处理隔离开,并且通过控制器连接起来,很好地实现了表现和逻辑的解耦,是⼀种标准的软件分层架构

⽬前现在更主流的开发⽅式是"前后端分离"的⽅式,后端开发⼯程师不再需要关注前端的实现
所以对于Java后端开发者,⼜有了⼀种新的分层架构:把整体架构分为表现层、业务逻辑层和数据层.这种分层⽅式也称之为"三层架构".
-  
表现层:就是展⽰数据结果和接受⽤⼾指令的,是最靠近⽤⼾的⼀层;
 -  
业务逻辑层:负责处理业务逻辑,⾥⾯有复杂业务的具体实现;
 -  
数据层:负责存储和管理与应⽤程序相关的数据
 
比如以下代码我们就可以进行分层处理

按照上⾯的层次划分,Spring MVC站在后端开发⼈员的⻆度上,也进⾏了⽀持,把上⾯的代码划分为三个部分:
-  
请求处理、响应数据:负责,接收⻚⾯的请求,给⻚⾯响应数据.
 -  
逻辑处理:负责业务逻辑处理的代码.
 -  
数据访问:负责业务数据的维护操作,包括增、删、改、查等操作
 
这三个部分,在Spring的实现中,也均有体现
 
-  
Controller:控制层。接收前端发送的请求,对请求进⾏处理,并响应数据。
 -  
Service:业务逻辑层。处理具体的业务逻辑。
 -  
Dao:数据访问层,也称为持久层。负责数据访问操作,包括数据的增、删、改、查
 
🎄MVC和三层架构的区别和联系
关于⼆者的关系,⼀直存在不同的观点.有⼈认为三层架构是MVC模式的⼀种实现,也有⼈认为MVC是三层架构的替代⽅案,等等各种说法都有.根本原因是⼤家站在不同的⻆度来看待这个问题的.
从概念上来讲,⼆者都是软件⼯程领域中的架构模式.
MVC架构模式由三部分组成,分别是:模型(Model),视图(View)和控制器(Controller).
三层架构将业务应⽤划分为:表现层,业务逻辑层,数据访问层.
 
 MVC中,视图和控制器合起来对应三层架构中的表现层.模型对应三层架构中的业务逻辑层,数据层,以及实体类
⼆者其实是从不同⻆度对软件⼯程进⾏了抽象.
MVC模式强调数据和视图分离,将数据展⽰和数据处理分开,通过控制器对两者进⾏组合.
三层架构强调不同维度数据处理的⾼内聚和低耦合,将交互界⾯,业务处理和数据库操作的逻辑分开.
⻆度不同也就谈不上互相替代了,在⽇常的开发中可以经常看到两种共存的情况,⽐如我们设计模型层的时候往往也会拆分出业务逻辑层(Service层)和数据访问层(Dao层)。但是⼆者的⽬的是相同的,都是"解耦,分层,代码复⽤"
🌳什么是高内聚低耦合
⾼内聚指的是:⼀个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越⾼,则内聚性越⾼,即"⾼内聚"。
低耦合指的是:软件中各个层、模块之间的依赖关联程序越低越好。修改⼀处代码,其他模块的代码改动越少越好

既要高内聚又要低耦合,这两者相互矛盾吗?
不⽭盾,⾼内聚指的是⼀个模块中各个元素之间的联系的紧密程度,低耦合指的是各个模块之间的紧密程度
这就好⽐⼀个企业,包含很多部⻔,各个部⻔之间的关联关系要尽可能的⼩,⼀个部⻔发⽣问题,要尽可能对降低对其他部⻔的影响,就是耦合.但是部⻔内部员⼯关系要尽量紧密,遇到问题⼀起解决,克服.这叫做内聚.
就好比邻⾥邻居,每一个家庭就是一个模块,楼上漏⽔导致楼下遭殃,就是耦合.家庭⼀个成员⽣病,其他成员帮忙照顾,就叫内聚.⼀个家庭内部的关系越紧密越好,⼀个家庭尽可能少的影响另⼀个家庭,就是低耦合。
⭕总结
关于《【JavaEE进阶】 关于应用分层》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!
相关文章:
【JavaEE进阶】 关于应用分层
文章目录 🎋序言🍃什么是应⽤分层🎍为什么需要应⽤分层🍀如何分层(三层架构)🎄MVC和三层架构的区别和联系🌳什么是高内聚低耦合⭕总结 🎋序言 在我们进行项目开发时我们如果一股脑将所有代码都…...
【已解决】c语言const/指针学习笔记
本博文源于笔者正在复习const在左与在右,指针优先级、a,&a,*a的区别。 1、const在左与在右 int const *p const int *p int * const p int const * const p const int * const p* 在const右边,指向的数据不可以改变,可以改变地址 * 在c…...
Android 系统启动过程纪要(基于Android 10)
前言 看过源码的都知道,Launcher系统启动都会经过这三个进程 init ->zygote -> system_server。今天我们就来讲解一下这三个进程以及Launcher系统启动。 init进程 准备Android虚拟机环境:创建和挂载系统文件目录;初始化属性服务&…...
【Docker实用篇】一文入门Docker(4)Docker-Compose
目录 1.Docker-Compose 1.1.初识DockerCompose 1.2.安装DockerCompose 1.2.1 修改文件权限 1.2.2 Base自动补全命令: 1.3部署微服务集群 1.3.1.compose文件 1.3.2.修改微服务配置 1.3.3.打包 1.3.4.拷贝jar包到部署目录 1.3.5.部署 1.Docker-Compose Doc…...
neo4j 图数据库 py2neo 操作 示例代码
文章目录 摘要前置NodeMatcher & RelationshipMatcher创建节点查询获取节点节点有则查询,无则创建创建关系查询关系关系有则查询,无则创建 Cypher语句创建节点 摘要 利用py2neo包,实现把excel表里面的数据,插入到neo4j 图数据…...
从uptime看linux平均负载
从前遇到系统卡顿只会top。。top看不出来怎么搞呢? Linux系统提供了丰富的命令行工具,以帮助用户和系统管理员监控和分析系统性能。在这些工具中,uptime、mpstat和pidstat是非常有用的命令,它们可以帮助你理解系统的平均负载以及资…...
经典数据库练习题及答案
数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --4.成绩…...
架构篇06-复杂度来源:可扩展性
文章目录 预测变化应对变化小结 复杂度来源前面已经讲了高性能和高可用,今天来聊聊可扩展性。 可扩展性指系统为了应对将来需求变化而提供的一种扩展能力,当有新的需求出现时,系统不需要或者仅需要少量修改就可以支持,无须整个系…...
flowable流程结束触发监听器 flowable获取结束节点 flowable流程结束事件响应监听器
flowable流程结束触发监听器 | flowable流程结束获取结束节点 | flowable流程结束事件响应监听器 下面代码是该监听器是对每个到达结束事件后执行的。 原本的流程定义是如果其中任意某个节点进行了驳回,则直接结束流程。 所以在每个节点的驳回对应的排他网关都设…...
【Python3】【力扣题】389. 找不同
【力扣题】题目描述: 【Python3】代码: 1、解题思路:使用计数器分别统计字符串中的元素和出现次数,两个计数器相减,结果就是新添加的元素。 知识点:collections.Counter(...):字典子类&#x…...
【从0上手cornerstone3D】如何加载nifti格式的文件
在线演示 支持加载的文件格式 .nii .nii.gz 代码实现 npm install cornerstonejs/nifti-volume-loader// ------------- 核心代码 Start------------------- // 注册一个nifti格式的加载器 volumeLoader.registerVolumeLoader("nifti",cornerstoneNiftiImageVolu…...
c# 学习笔记 - 异步编程
文章目录 1. 异步编程介绍1.1 简单介绍1.2 async/await 使用1.3 Task/Task<TResult> 对象 2. 样例2.1 迅速启动所有任务,仅当需要结果才等待任务执行2.2 使用 await 调用异步方法,即使这个异步方法内有 await 也不会同时执行回调和向下执行操作(必…...
设置了uni.chooseLocation,小程序中打不开
设置了uni.chooseLocation,在小程序打不开,点击没反应,地图显现不出来; 解决方案: 1.Hbuilder——微信开发者工具路径没有配置 打开工具——>设置 2.微信小程序服务端口没有开 解决方法:打开微信开发…...
spring retry 配置及使用
spring retry 配置及使用 接口或功能因外界异常导致失败后进行重推机制 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.1.RELEASE</version></p…...
uni-app的组件(二)
多项选择器checkbox-group 多项选择器,内部由多个 checkbox 组成。 <checkbox-group><checkbox checked color"red" value"1"></checkbox> 篮球<!-- disabled:是否禁用 --><checkbox disabled color"rgba(0,0…...
项目开发中安全问题以及解决办法——客户传进来的数据不可信
用户传进来的数据是不可信的,比如下面这种情况下: PostMapping("/order") public void wrong(RequestBody Order order) { this.createOrder(order); } Data public class Order { private long itemId; //商品ID private BigDecimal ite…...
解决springboot启动报Failed to start bean ‘subProtocolWebSocketHandler‘;
解决springboot启动报 Failed to start bean subProtocolWebSocketHandler; nested exception is java.lang.IllegalArgumentException: No handlers 问题发现问题解决 问题发现 使用springboot整合websocket,启动时报错,示例代码: EnableW…...
什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(一)
什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(一)。 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。在不同的书籍上, 不同的作者, 对于架构的定义也不统一, 角度不同, 定义不同。 一、架构是什么 Linux 有架构,MySQL 有架构,J…...
【多线程】认识Thread类及其常用方法
📄前言: 本文是对以往多线程学习中 Thread类 的介绍,以及对其中的部分细节问题进行总结。 文章目录 一. 线程的 创建和启动🍆1. 通过继承 Thread 类创建线程🍅2. 通过实现 Runnable 接口创建线程🥦3. 其他方…...
多用户商业版 whisper 2.1在线搭建教程
1. 准备工作 购买许可证:确保你已经购买了足够数量的用户许可证,以便所有员工或客户都能使用软件。系统要求:检查你的服务器和客户端计算机是否满足软件的最低系统要求。网络配置:确保你的网络环境(如防火墙、路由器等…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
