当业务逻辑、数据访问和请求处理全部堆砌在 Controller 中时,项目会变得难以维护和扩展。本文将带你深入理解应用分层思想,并通过重构图书管理系统,掌握 Spring MVC 三层架构的落地实践,让你的代码结构清晰、职责分明。


引言:为什么你需要关注应用分层?
在软件开发初期,为了快速上线,我们往往将所有代码塞进同一个类中。但随着业务复杂度上升,这种“大泥球”式的代码会带来逻辑混乱、模块耦合、扩展性差等一系列问题。应用分层作为一种核心的架构设计思想,正是解决这些痛点的关键。它通过将应用程序划分为多个职责独立的层次,让各层协同工作,从而实现高内聚、低耦合的设计目标。
无论你使用 Java、Go 还是 Python 进行后端开发,理解分层架构都是构建可维护系统的基石。本文将基于 Spring MVC 框架,带你从零开始掌握应用分层的核心概念与实战技巧。
在完成 Spring MVC 基础功能的开发练习后,我们发现了一个亟待解决的问题:即便只是实现了少量核心功能,项目代码已呈现出混乱的状态;若后续完成全量业务功能的开发,代码体系(包括文件结构与代码内容)将会陷入更严重的无序状态。因此,接下来我们学习应用分层。
认识 MVC 与三层架构
MVC(Model-View-Controller)是经典的软件设计模式,它将应用分为模型、视图和控制器三个部分。其中,View 负责用户界面展示,Controller 接收用户请求并调度 Model 处理,Model 则封装业务数据和规则。这种模式将界面与业务逻辑解耦,是应用分层思想的早期实践。
随着前后端分离成为主流,后端开发者更关注另一种分层架构——三层架构。它从后端视角出发,将系统划分为:
- 表现层(Controller):最接近用户,负责接收前端请求和返回响应数据。
- 业务逻辑层(Service):核心业务逻辑的处理中心,如订单计算、库存校验等。
- 数据访问层(Dao):负责与数据库交互,执行增删改查等持久化操作。
在阿里开发手册中,对工程结构的应用分层也有明确的规范定义。下图展示了典型的层次划分:

MVC 与三层架构:区别与联系
关于 MVC 与三层架构的关系,业界一直存在不同观点。有人认为三层架构是 MVC 的实现,也有人认为两者是替代关系。其实,它们是从不同维度对软件工程进行的抽象。
MVC 模式强调数据和视图的分离,通过 Controller 作为桥梁来连接二者,关注的是展示逻辑与业务逻辑的解耦。而三层架构则更侧重于数据处理流程的纵向切分,强调表现层、业务逻辑层和数据访问层各自的高内聚与低耦合。
在实际开发中,两者常常共存。例如,MVC 中的 Model 层,在三层架构中往往会被进一步拆分为 Service 层和 Dao 层。无论采用哪种架构,其核心目的都是相同的:解耦、分层、代码复用。理解这一点,能帮助你在不同技术栈(如 C++ 或 TypeScript)中灵活运用架构思想。

在 Spring MVC 框架中,三层架构得到了很好的支持。Controller、Service、Dao 分别对应表现层、业务逻辑层和数据访问层,框架为每一层都提供了相应的组件支持。



实战重构:图书管理系统的分层改造
理论讲得再多,不如动手实践。下面我们以图书管理系统为例,将原先所有代码堆砌在 Controller 中的“大泥球”项目,按照三层架构思想进行重构。
首先,我们需要创建四个核心包:controller、service、dao 和 model,分别存放控制层、业务层、数据访问层和实体类代码。

重构后的代码结构
Controller 层:负责处理前端请求,接收参数并返回数据。它不包含任何业务逻辑,只做请求的转发和响应的组装。
package com.hbu.book.controller;
import com.hbu.book.model.BookInfo;
import com.hbu.book.service.BookService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("book")
public class BookController {
@RequestMapping("/getList")
public List<BookInfo> getList(){
BookService bookService = new BookService();
List<BookInfo> books = bookService.getBookList();
return books;
}
}
Service 层:承载核心业务逻辑。比如,在新增图书时,需要校验图书编号是否重复、计算库存等操作都在这一层完成。
package com.hbu.book.service;
import com.hbu.book.dao.BookDao;
import com.hbu.book.model.BookInfo;
import lombok.val;
import java.util.List;
public class BookService {
public List<BookInfo> getBookList(){
BookDao bookDao = new BookDao();
List<BookInfo> books = bookDao.mockData();
for(BookInfo book : books){
if(book.getStatus() == 1){
book.setStatusCN("可借阅");
}else {
book.setStatusCN("不可借阅");
}
}
return books;
}
}
Dao 层:封装所有数据库操作,如查询图书列表、根据 ID 删除图书等。这一层只关注数据的持久化,不涉及任何业务判断。
package com.hbu.book.dao;
import com.hbu.book.model.BookInfo;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class BookDao {
public List<BookInfo> mockData() {
List<BookInfo> books = new ArrayList<>();
for (int i = 0; i < 5; i++) {
BookInfo book = new BookInfo();
book.setId(i);
book.setBookName("书籍" + i);
book.setAuthor("作者" + i);
book.setCount(i * 5 + 3);
book.setPrice(new BigDecimal(new Random().nextInt(100) + 1));
book.setPublish("出版社" + i);
book.setStatus(1);
books.add(book);
}
return books;
}
}
Model 层:定义实体类,如 Book 对象,用于在层与层之间传递数据。
package com.hbu.book.model;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class BookInfo {
private Integer id;
private String bookName;
private String author;
private Integer count;
private BigDecimal price;
private String publish;
private Integer status; // 0-删除, 1-正常, 2-不允许借阅
private String statusCN;
}
重构完成后,我们启动项目并运行测试。可以看到,功能与之前完全一致,但代码的组织结构发生了质的变化。

✅ 运行结果显示,代码一切正常。现在,我们只需要看一眼包名,就能快速定位到代码所属的层次,项目结构一目了然。
应用分层带来的核心收益
应用分层之所以成为主流的开发设计思想,是因为它带来了实实在在的好处:
- 降低依赖,提升复用性:层与层之间通过接口交互,降低耦合度。各层的核心逻辑可以独立复用,避免重复开发。
- 聚焦职责,降低维护成本:开发人员只需关注当前层的实现细节,无需理解其他层。这大大缩短了新成员的上手时间,也降低了维护难度。
- 灵活替换,增强扩展性:当需要替换数据源(如从 MySQL 换到 PostgreSQL)时,只需修改 Dao 层实现,其他层完全不受影响。
- 规范开发,利于标准化:明确的分层规则为团队协作提供了统一的开发规范,便于代码审查和项目交接。
技术栈对比:无论是 Java 的 Spring Boot、Go 的 Gin,还是 Python 的 Django,分层架构的思想都是相通的。掌握这种设计模式,能让你在不同语言和框架间游刃有余。
[AFFILIATE_SLOT_1]企业级应用分层规范参考
在实际企业开发中,除了三层架构,通常还会引入更多的层次来应对复杂的业务场景。例如,阿里开发手册中推荐的工程结构就包括了更细粒度的拆分,如门面层(Facade)、领域层(Domain)等。
这些规范的核心目的都是为了实现“高内聚、低耦合”。对于初学者而言,先掌握好 Controller-Service-Dao 的三层结构,再逐步理解更复杂的分层模型,是一条高效的学习路径。
更多关于企业级应用分层的详细规范,可以参考阿里云开发者社区的相关文章。
详情请看:https://developer.aliyun.com/article/1589859
[AFFILIATE_SLOT_2]总结
应用分层是构建高质量软件系统的基石。通过将系统划分为表现层、业务逻辑层和数据访问层,我们实现了代码的解耦、复用和清晰管理。本文通过图书管理系统的实战重构,展示了 Spring MVC 中三层架构的落地方法。掌握这一思想,无论你使用 Java、Go 还是其他语言,都能写出更优雅、更易维护的代码。
浙公网安备 33010602011771号