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