MVC及其衍生

MVC

把软件分成模型(Model)、视图(View)、控制器(Controller)三个基本部分。
事实上对应着
Controller——输入
用户交互,将输入处理成Controller能处理的形式

Model——处理
描述状态、逻辑规律、运算方法、存储

View——输出
当数据经过模型处理发生变化,View通过Controller进行更新。

存在的问题

虽然划分了MVC,三者之间的关系事实上是相互依赖的,实际上并不分割,三者仍需要整体设计。介绍之前学习一个23种之外,但同样非常重要的MVC模式。

MVC衍生模式

ADR——MVC思想向WEB应用的转化
HMVC——为了单独处理网页的小区域,挂弹窗广告的
MVP——解决自动化单元测试,进行模型和视图的单独测试
MVVM——通过GUI直接操作领域模型,弱化控制器功能,侧重模型和视图
MVA——为领域模型增加不同的前端界面,WEB、APP、小程序等

后续发展

经典的 MVC 模式

MVC(Model-View-Controller)是一种表现层的设计模式,主要目的是将用户界面(UI)的逻辑与业务逻辑分离。

Model (模型):代表应用程序的数据和业务规则。它负责数据的存取、验证和业务处理。

View (视图):用户看到的界面,负责展示数据(从Model获取)和接收用户输入。它不包含业务逻辑。

Controller (控制器):接收用户的请求,调用Model进行处理,并根据结果选择相应的View返回给用户。它是Model和View之间的协调者。

在早期Java Web开发(如Servlet/JSP时代)中的实现:

View:JSP 页面,主要负责显示。

Controller:Servlet,接收HTTP请求,处理参数。

Model:JavaBean(POJO),或者直接在Servlet中调用JDBC进行数据库操作。

存在的问题:

职责不清:Servlet(Controller)往往承担了太多工作,如参数解析、业务逻辑调用、数据库操作(DAO)、数据校验、选择视图等,容易变成“上帝类”(God Class),非常臃肿。

高度耦合:业务逻辑、数据访问逻辑和表现层逻辑混杂在一起,任何一方的修改都可能影响其他部分,难以测试和维护。

复用性差:业务逻辑被写在Servlet中,无法在其他地方复用。

三层架构(3-Tier Architecture)

为了解决MVC模式中Controller过于臃肿的问题,开发者将应用在纵向(逻辑上)划分为三个明确的层次,每个层次职责单一。这是一种更宏观的、涵盖整个应用的架构模式。

表现层 (Presentation Layer / Web Layer)

职责:处理用户交互,接收请求,渲染响应。

对应MVC:包含了MVC中的 Controller 和 View。

技术实现:Spring MVC 中的 @Controller, @RestController, JSP, Thymeleaf 等。

业务逻辑层 (Business Logic Layer / Service Layer)

职责:包含应用程序的核心业务逻辑。它协调多个数据访问操作,处理事务、权限、日志等跨领域关注点。

技术实现:Spring 的 @Service 组件。

数据访问层 (Data Access Layer / Persistence Layer)

职责:负责与数据库进行交互,执行CRUD(增删改查)操作。

技术实现:DAO (Data Access Object) 模式,Spring 的 @Repository 组件,通常使用 JPA、MyBatis、Hibernate 等ORM框架。

与MVC的关系:
你可以将三层架构理解为对MVC中“Model”部分的细化。原本臃肿的Model被拆解为了Service层和DAO层,而MVC中的 C和V 则共同构成了三层架构中的表现层。

MVC 组件 在三层架构中的对应部分
Controller 表现层的一部分
View 表现层的一部分
Model 被拆分为 业务逻辑层 和 数据访问层
此时的架构图:

text
用户请求 -> [表现层 (Controller/View)] -> [业务逻辑层 (Service)] -> [数据访问层 (DAO/Repository)] -> 数据库
响应 <- <-

Spring Framework

Spring 框架的出现极大地促进和规范了三层架构的实现。

IoC (控制反转) / DI (依赖注入):这是最核心的贡献。Spring 容器负责创建和管理各层对象(Bean),并自动将它们注入到需要的地方(如将 Repository 注入到 Service,将 Service 注入到 Controller)。这彻底解决了层与层之间的硬编码耦合问题,使得各层可以独立开发、测试和替换。

声明式事务管理:通过在Service层使用 @Transactional 注解,可以将复杂的事务管理从业务代码中剥离,由Spring代理实现,大大简化了开发。

AOP (面向切面编程):允许将像日志、安全、事务这样的横切关注点模块化,然后透明地应用到业务逻辑中,使得业务代码更加纯净和专注。

丰富的集成支持:Spring 对各类ORM框架(Hibernate, JPA, MyBatis)、Web框架(Spring MVC)提供了无缝集成,让开发者可以专注于各层的业务实现,而不是技术整合。

总结:Spring框架为三层架构提供了成熟的、标准化的实现手段和解耦工具。

Spring Boot

Spring Boot 并不是一个新的架构,它是对基于Spring的三层架构开发的进一步简化和完善,主打“约定大于配置”。

自动化配置 (Auto-Configuration):

Spring Boot 根据项目依赖(如classpath下是否有MySQL驱动、Spring Data JPA等)自动配置应用程序所需的Bean和基础设施。

这避免了在传统Spring项目中编写大量繁琐的XML或Java配置,让开发者几乎可以“开箱即用”。

嵌入式Web服务器:

内置Tomcat、Jetty等服务器,可以将应用打包成一个独立的、可执行的JAR文件,无需部署到外部Web容器。这简化了部署和运维。

Starter依赖:

提供一系列“启动器”(如 spring-boot-starter-web, spring-boot-starter-data-jpa),通过一个依赖就能引入整个功能模块所需的所有jar包,避免了依赖地狱。

Actuator:

提供生产级特性,如监控应用健康状态、指标收集等,使得三层架构的应用不仅易于开发,还易于运维。

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

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

相关文章

微硕WINSOK MOS管WSF3089,赋能汽车转向系统安全升级

随着汽车电子化程度不断提高&#xff0c;转向系统对高效功率器件的需求日益增长。微硕WINSOK推出的N沟道Trench MOS管WSF3089&#xff0c;以30 V/72 A大电流、4.5 mΩ超低导通电阻和TO-252-2L紧凑封装&#xff0c;为EPS&#xff08;电动助力转向&#xff09;电机驱动、电源管理…

淘宝拍立淘接口的接入与应用||item_search_img-按图搜索淘宝商品(拍立淘)

淘宝拍立淘接口的接入与应用如下&#xff1a;接入流程注册与认证&#xff1a;开发者账号注册&#xff1a;访问淘宝开放平台&#xff0c;进行开发者账号注册。创建应用&#xff1a;在控制台创建新应用&#xff0c;获取 App Key 和 App Secret&#xff0c;这是接口调用的凭证。申…

Python学习-day8 元组tuple

元组&#xff08;Tuple&#xff09;是Python中一种不可变的序列类型&#xff0c;用于存储多个有序元素。与列表&#xff08;List&#xff09;类似&#xff0c;但元组一旦创建后不能修改&#xff08;不可添加、删除或修改元素&#xff09;&#xff0c;这使得它在安全性、性能优化…

大数据毕业设计选题推荐-基于大数据的国家医用消耗选品采集数据可视化分析系统-Hadoop-Spark-数据可视化-BigData

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

二次学习C语言补充2

文章目录表栈、队列、二叉树一、二叉树二、表栈三、队列链表一、单向链表二、循环链表、双向链表和双向循环链表预处理一、预处理二、宏定义文件文件操作补充本篇文章是对二次学习C语言12——文件操作 二次学习C语言14——预处理及模块化 二次学习C语言15——链表 二次学习C语言…

2.9Vue创建项目(组件)的补充

1.再创建和引入vue的选择2.VsCode插件 安装Vue自己搜索最新的3.style自己的作用域在一个组件中引入另一个文件的子组件&#xff0c;给当前组件设置样式&#xff0c;那么子组件的样式也会改变的。为了解决这个问题 我们在自己的style中设置一个属性4.另一种创建vue 的方式(主流…

算法高频题

刷题&#xff1a;LeetCode&#xff08;Top 100-150题&#xff0c;至少刷两遍&#xff09;。重点&#xff1a;链表、树、二分查找、动态规划、回溯、栈/队列。 每一个题型&#xff0c;前10个高频题 算法思考框架参考&#xff1a;算法题思维框架-CSDN博客 高频顺序参考网站&…

服务器安装 LDOPE(MODIS 数据处理工具)

目录下载方式1-&#xff08;简单快捷&#xff09;根据WRF-VPRM 需要打补丁下载方式2&#xff1a;&#xff08;手动安装依赖&#xff09;一、安装所需依赖库&#xff08;4 个主库 2 个基础库&#xff09;另- HDF-EOS 手动编译二、解压并安装 LDOPE参考下载方式1-&#xff08;简…

克隆代币 + 捆绑开盘:多链环境下的低成本发币玩法

在加密世界&#xff0c;发币已经不再是“少数开发者的专利”。随着工具的普及&#xff0c;任何人都可以快速发行一个在加密世界&#xff0c;发币已经不再是“少数开发者的专利”。随着工具的普及&#xff0c;任何人都可以快速发行一个代币。但问题是&#xff1a;如何在保证低成…

数据结构中的 二叉树

1.前言 在 Java 中&#xff0c;树&#xff08;Tree&#xff09;是一种非线性数据结构&#xff0c;由节点&#xff08;Node&#xff09;组成&#xff0c;常见的线性表则是我们之前学过的顺序表、链表、栈、队列等等。每个节点包含数据和指向子节点的引用。树的常见实现方式包括二…

IntelliJ IDEA 启动项目时配置端口指南

&#x1f31f; 一、为什么需要手动设置启动端口&#xff1f; 默认情况下&#xff0c;Spring Boot 应用会使用 8080 端口启动。但在以下场景中&#xff0c;我们必须自定义端口&#xff1a; 多个微服务同时运行&#xff0c;需避免端口冲突&#xff1b;团队协作开发&#xff0c;统…

spark sql之from_json函数

目录前言函数语法参数说明返回值案例案例1案例2前言 在Spark SQL中&#xff0c;from_json函数用于解析包含JSON字符串的列&#xff0c;并将其转换为Spark SQL的结构化类型&#xff08;如struct、map或array&#xff09; 函数语法 from_json(jsonStr, schema [, options])参数…

数据结构 之 【位图的简介】

目录 1.位图的引入 2.位图概念 3.位图的实现 3.1前提准备 3.2set 3.3reset 3.4test 4.位图的应用 1.位图的引入 给40亿个不重复的无符号整数&#xff0c;没排过序 再给一个无符号整数&#xff0c;如何快速判断这个无符号整数是否在 这40亿个数中 首先&#xff0c;一个…

[iOS] ViewController 的生命周期

文章目录前言一、UIViewController 生命周期有关函数二、UIViewController 中函数的执行顺序运行结果1.present和dismiss2.push和pop三、总结前言 UIViewController 是在 iOS 开发中一个非常重要的角色&#xff0c;他是 view 和 model 的桥梁&#xff0c;通过 UIViewControlle…

第30章 零售与电商AI应用

本章将深入探讨人工智能在零售与电商领域的革命性应用。我们将从智能推荐系统、动态定价、库存管理到创新的虚拟试衣间&#xff0c;全面解析AI如何重塑购物体验和商业运营效率&#xff0c;并为每个关键技术点提供代码实战&#xff0c;帮助你掌握将AI应用于真实商业场景的能力。…

QT通过QModbusRtuSerialMaster读写电子秤数据实例

一、电子称常用功能&#xff1a;称重、清零、去皮&#xff1b;电子秤的通讯方式&#xff1a;Modbus通信、串口通信。二、QT读写电子秤软件界面如下&#xff1a;三、核心代码如下&#xff1a;.pro项目文件代码&#xff1a;QT core gui serialbus serialport.h头文件代码#…

sqlmap常用命令

ZZHow(ZZHow1024) 一、扫描注入点 1.GET方法&#xff0c;给URL&#xff1a; #探测该url是否存在漏洞 python sqlmap.py -u "http://192.168.10.1/sqli/Less-1/?id1"#如果我们已经知道admin这里是注入点的话&#xff0c;可以在其后面加个*来让sqlmap对其注入 python …

JVM如何排查OOM

当JVM&#xff08;Java虚拟机&#xff09;出现OOM&#xff08;OutOfMemoryError&#xff09;时&#xff0c;可以按照以下步骤和方法&#xff0c;用于帮助定位和解决JVM中的OOM问题1.查看异常堆栈信息查看异常堆栈信息&#xff08;StackTrace&#xff09;是定位问题的关键。OOM异…

存算一体芯片生态评估:从三星PIM到知存科技WTM2101

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;存算一体技术的崛起与意义 在传统冯诺…

[数据结构] 栈 · Stack

一.栈 stack 1.概念 栈 : 一种特殊的线性表 , 其只允许再固定的一段进行插入和删除元素操作 进行数据插入和删除操作的一段称为 栈顶 ; 另一端称为栈底栈中的数据元素遵循 先进后出 原则(LIFO)压栈 : 栈的插入操作叫做 进栈 或 压栈 或 入栈 , 入数据在栈顶出栈 : 栈的删除…