1. 概述
本文将深入探讨 Spring MVC 中 @Controller
和 @RestController
注解的核心区别。这两种注解在 Spring 开发中至关重要,但使用场景和效果截然不同。
传统 Spring 控制器使用 @Controller
注解,它作为框架的基础组件已存在多年。而 Spring 4.0 引入的 @RestController
则是专门为构建 RESTful Web 服务设计的便捷注解——它本质上就是 @Controller
和 @ResponseBody
的组合体,能让我们省去为每个方法重复添加 @ResponseBody
的麻烦。
2. Spring MVC 中的 @Controller
@Controller
是 Spring 框架中的经典控制器注解,本质上是 @Component
的特化版本。通过类路径扫描,Spring 能自动检测到使用该注解的实现类。
在实际开发中,我们通常将 @Controller
与 @RequestMapping
组合使用来处理请求。来看个直观的例子:
@Controller
@RequestMapping("books")
public class SimpleBookController {
@GetMapping("/{id}", produces = "application/json")
public @ResponseBody Book getBook(@PathVariable int id) {
return findBookById(id);
}
private Book findBookById(int id) {
// ...
}
}
⚠️ 注意关键点:请求处理方法上标注了 @ResponseBody
。这个注解的作用是自动将返回对象序列化到 HttpResponse 中。没有它,Spring 会尝试寻找视图解析器,导致返回 JSON 时踩坑。
3. Spring MVC 中的 @RestController
@RestController
是控制器的"加强版",它内置了 @Controller
和 @ResponseBody
的功能。使用它能显著简化控制器实现:
@RestController
@RequestMapping("books-rest")
public class SimpleBookRestController {
@GetMapping("/{id}", produces = "application/json")
public Book getBook(@PathVariable int id) {
return findBookById(id);
}
private Book findBookById(int id) {
// ...
}
}
✅ 核心优势:由于类级别使用了 @RestController
,所有方法默认都会启用 @ResponseBody
效果。这意味着:
- 无需为每个方法重复添加
@ResponseBody
- 返回对象会自动序列化为 JSON/XML
- 代码更简洁,维护成本更低
4. 总结
通过对比可以明确两种注解的适用场景:
特性 | @Controller | @RestController |
---|---|---|
核心用途 | 传统 MVC 控制器 | RESTful Web 服务 |
是否需要 @ResponseBody | 方法级必须添加 | 类级别自动生效 |
返回数据处理 | 需显式配置 | 自动序列化 |
代码简洁度 | 较低(需重复注解) | 较高(注解复用) |
开发建议:
- 构建传统页面跳转应用 → 用
@Controller
- 开发 REST API → 直接选
@RestController
完整示例代码可在 GitHub 项目 获取(Maven 项目可直接导入使用)。