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 应用 | 新项目、快速开发、微服务架构 |
开发速度 | ⏳ 速度较慢,需要大量配置 | 🚀 快速,默认配置可直接运行 |
学习曲线 | 📈 稍复杂,配置繁琐 | 📉 更简单,自动化配置 |
性能优化 | 手动优化 | 内置优化机制 |