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 效果。这意味着:

  1. 无需为每个方法重复添加 @ResponseBody
  2. 返回对象会自动序列化为 JSON/XML
  3. 代码更简洁,维护成本更低

4. 总结

通过对比可以明确两种注解的适用场景:

特性 @Controller @RestController
核心用途 传统 MVC 控制器 RESTful Web 服务
是否需要 @ResponseBody 方法级必须添加 类级别自动生效
返回数据处理 需显式配置 自动序列化
代码简洁度 较低(需重复注解) 较高(注解复用)

开发建议

  • 构建传统页面跳转应用 → 用 @Controller
  • 开发 REST API → 直接选 @RestController

完整示例代码可在 GitHub 项目 获取(Maven 项目可直接导入使用)。


原始标题:The Spring @Controller and @RestController Annotations