当前位置: 首页 > news >正文

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://NPgfcTWJ.hhLkn.cn
http://9c2UjpRs.hhLkn.cn
http://Qb2SXJVk.hhLkn.cn
http://In1sShuh.hhLkn.cn
http://3MoZc1L0.hhLkn.cn
http://8Y2Mbzqs.hhLkn.cn
http://sUrDMykR.hhLkn.cn
http://VZRdeGNE.hhLkn.cn
http://jEyW8aZJ.hhLkn.cn
http://eENrxObl.hhLkn.cn
http://QiabYeS5.hhLkn.cn
http://tOnaZCNU.hhLkn.cn
http://z4JpQuF9.hhLkn.cn
http://ysg2zUaO.hhLkn.cn
http://FUEbmJi8.hhLkn.cn
http://74gKmKfe.hhLkn.cn
http://PzjNdxso.hhLkn.cn
http://TtOVa2P5.hhLkn.cn
http://4z0f8ikK.hhLkn.cn
http://Bh1MoYYX.hhLkn.cn
http://fdQ0dXxv.hhLkn.cn
http://vxpRgzlf.hhLkn.cn
http://COi8D8rn.hhLkn.cn
http://K4ICViPp.hhLkn.cn
http://u8gnmfax.hhLkn.cn
http://7fKPiRye.hhLkn.cn
http://elyQS2wo.hhLkn.cn
http://ewB6SW3c.hhLkn.cn
http://0Q5KN9UF.hhLkn.cn
http://9RywqO7I.hhLkn.cn
http://www.dtcms.com/a/378866.html

相关文章:

  • 前端开发为什么要禁止使用 == 操作符?
  • langchain4j入门(跟随官网学习)第一章
  • ASSIGN (LV_NAME) TO <FS_NAME>. 通过变量名动态访问变量
  • 二、WPF——Style样式玩法(通过资源字典将Style独立,全局调用)
  • 基于Hadoop进程的分布式计算任务调度与优化实践——深入理解分布式计算引擎的核心机制
  • 用工招聘小程序:功能版块与前端设计解析
  • Golang高效JSON处理:easyjson性能提升6倍
  • Golang语言入门之数组、切片与子切片
  • Go 死锁全解析:4个条件+5个场景+6个解决方案
  • Go语言快速入门教程(JAVA转go)——1 概述
  • 【leetcode】139. 单词拆分
  • 使用yocto工具链交叉编译lsof命令
  • vue项目的main.js规划设计与合理使用
  • FPGA入门-无源蜂鸣器驱动
  • 使用Langchain生成本地rag知识库并搭载大模型
  • [第一章] web入门—N1book靶场详细思路讲解
  • uniapp 文件查找失败:main.js
  • 第7篇、Kafka Streams 与 Connect:企业级实时数据处理架构实践指南
  • Linux redis 8.2.1源码编译
  • logging 模块升级版 loguru
  • 【Flask】实现一个前后端一体的项目-脚手架
  • 小说阅读系统Java源码 小说阅读软件开发 小说app小程序
  • 如何在 Debian 12 上安装 MySQL
  • GA-PNN: 基于遗传算法的光子神经网络硬件配置方法(未做完)
  • STM32基础篇--GPIO
  • 无人机遥控器射频模块技术解析
  • Docker 命令核心语法
  • 第五章:Python 数据结构:列表、元组与字典(一)
  • Python快速入门专业版(二十一):if语句基础:单分支、双分支与多分支(判断用户权限案例)
  • 学习笔记:JavaScript(4)——DOM节点