Spring MVC和Spring Boot的三层架构差异
Spring MVC和Spring Boot的三层架构本质上是相同的,但两者在实现上存在一些差异,尤其在开发效率、配置方式和项目结构方面。
1. 三层架构概念(两者通用)
无论是Spring MVC还是Spring Boot,三层架构的核心概念是一样的:
Controller 层 | 接收 HTTP 请求,负责路由、参数校验、请求转发,调用 Service 层。 |
Service 层 | 负责具体的业务逻辑,执行数据处理、组合查询、复杂计算等。 |
DAO / Repository 层 | 负责与数据库打交道,提供增删改查 (CRUD) 等数据访问操作。 |
2. 主要区别对比
架构名称 | Spring MVC | Spring Boot |
项目启动方式 | 需要配置Web容器(如 Tomcat)并手动启动 | 内置Tomcat(默认),可直接运行main方法启动 |
配置方式 | 需手动配置XML文件,或者使用@Configuration | 约定大于配置,默认配置即开箱即用,极大减少了XML配置 |
依赖管理 | 需手动引入相关依赖,版本管理复杂 | 提供 starter依赖(如spring-boot-starter-web),简化依赖管理 |
Controller 层 | 使用@Controller、@RequestMapping | 使用@RestController(自动加@ResponseBody),简化JSON响应 |
Service 层 | 使用@Service,需手动定义Bean | 使用@Service,结合@Autowired自动注入,简化配置 |
DAO / Repository 层 | 需手动配置@Repository 、数据库连接池、数据源等 | 使用spring-boot-starter-data-jpa等Starter自动配置数据源 |
异常处理 | 需编写@ExceptionHandler来处理异常 | 提供@RestControllerAdvice,全局异常处理更简便。 |
静态资源管理 | 需手动配置/webapp或/static目录 | 默认将/static、/public、/resources作为静态资源路径 |
热部署 | 需借助JRebel等工具实现 | 内置spring-boot-devtools,支持热部署,提升开发效率 |
嵌入式服务器 | ❌ 需单独配置Tomcat / Jetty等服务器 | ✅ 自带 Tomcat(默认) / Jetty / Undertow,可快速启动 |
监控和管理 | 无内置监控功能,需手动整合 | ✅ 内置spring-boot-starter-actuator,轻松实现应用监控 |
3. 项目结构差异
🔹 Spring MVC 项目结构
传统的Spring MVC项目结构较复杂,通常需要手动配置Controller、Service、DAO、视图解析器等:
/src
└── main
├── java
│ ├── com.example.controller
│ │ └── OrderController.java
│ ├── com.example.service
│ │ └── OrderService.java
│ ├── com.example.repository
│ │ └── OrderRepository.java
│ ├── com.example.model
│ │ └── Order.java
│ └── com.example.config
│ └── AppConfig.java
├── resources
│ ├── applicationContext.xml
│ ├── dispatcher-servlet.xml
│ └── web.xml
🔹 Spring Boot 项目结构
Spring Boot 项目简化了繁琐的配置,默认支持自动配置:
/src
└── main
├── java
│ ├── com.example
│ │ ├── Application.java // 主启动类
│ │ ├── controller
│ │ │ └── OrderController.java
│ │ ├── service
│ │ │ └── OrderService.java
│ │ ├── repository
│ │ │ └── OrderRepository.java
│ │ └── model
│ │ └── Order.java
├── resources
│ └── application.yml // 核心配置文件
4. 代码示例对比
🔹 Spring MVC 示例
OrderController.java
@Controller
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String getOrderById(@PathVariable Long id, Model model) {
Order order = orderService.getOrderById(id);
model.addAttribute("order", order);
return "orderDetail"; // 返回视图名
}
}
🔹 Spring Boot 示例
OrderController.java
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("/{id}")
public Order getOrderById(@PathVariable Long id) {
return orderService.getOrderById(id); // 直接返回 JSON
}
}
✅ @RestController直接返回JSON 数据,无需再加@ResponseBody。
✅ @GetMapping代替@RequestMapping,更简洁明了。
5. 哪种更适合你的项目?
✅ 如果你的项目是全新开发,推荐使用 Spring Boot,因为它的自动配置和简化操作能提升开发效率。
✅ 如果你的项目是老项目或已使用 Spring MVC,继续使用 Spring MVC 可能更稳定,除非需要升级。
6. 终极总结
推荐场景 | 传统企业项目、复杂的 Web 应用 | 新项目、快速开发、微服务架构 |
开发速度 | ⏳ 速度较慢,需要大量配置 | 🚀 快速,默认配置可直接运行 |
学习曲线 | 📈 稍复杂,配置繁琐 | 📉 更简单,自动化配置 |
性能优化 | 手动优化 | 内置优化机制 |

