@RestController 和 @Controller 的区别
@RestController 和 @Controller 的区别
在 Spring 框架中,@RestController 和 @Controller 都是用于定义控制器的注解,但它们的用途和行为有所不同。以下是它们的区别:
- 基本定义
-
@Controller:- 是一个通用的注解,用于标识一个类是 Spring MVC 的控制器。
- 默认情况下,
@Controller的方法会返回视图名称(View Name),并结合视图解析器(ViewResolver)渲染页面。
-
@RestController:- 是
@Controller和@ResponseBody的组合注解。 - 方法的返回值会被直接写入 HTTP 响应体中,通常用于开发 RESTful API。
- 是
- 返回值处理方式
| 注解 | 返回值处理方式 |
|---|---|
@Controller |
方法返回值被视为视图名称(如 JSP、Thymeleaf 页面),由视图解析器处理并渲染页面。 |
@RestController |
方法返回值会被直接序列化为 JSON 或 XML 格式,并写入 HTTP 响应体中。 |
- 使用场景
-
@Controller:- 适用于传统的 Web 应用开发,返回 HTML 页面。
- 示例:用户登录后跳转到主页,或者显示表单页面。
-
@RestController:- 适用于开发 RESTful API,返回 JSON 或 XML 数据。
- 示例:提供接口供前端或第三方系统调用,返回数据而不是页面。
- 代码示例
(1) 使用 @Controller
@Controller
public class CourseController {
@GetMapping("/courses")
public String getCourses(Model model) {
// 向模型中添加数据
model.addAttribute("courses", List.of("Math", "Physics", "Chemistry"));
// 返回视图名称
return "courseList"; // 视图解析器会解析为 courseList.html 或 courseList.jsp
}
}
- 说明: 返回值
"courseList"是视图名称,Spring 会根据配置的视图解析器找到对应的模板文件(如courseList.html或courseList.jsp)并渲染页面。
(2) 使用 @RestController
@RestController
public class CourseRestController {
@GetMapping("/courses")
public List<String> getCourses() {
// 直接返回数据
return List.of("Math", "Physics", "Chemistry");
}
}
- 说明: 返回值是一个
List<String>,Spring 会将其序列化为 JSON 格式并直接写入 HTTP 响应体中,例如:["Math", "Physics", "Chemistry"]
- 内部实现
@RestController:-
实际上是
@Controller和@ResponseBody的组合:@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller @ResponseBody public @interface RestController { String value() default ""; } -
因此,
@RestController的所有方法默认都会被加上@ResponseBody,返回值不会经过视图解析器处理。
-
总结
| 特性 | @Controller |
@RestController |
|---|---|---|
| 返回值处理 | 返回视图名称,渲染页面 | 返回数据,写入 HTTP 响应体 |
| 适用场景 | 传统 Web 应用,返回页面 | RESTful API 开发,返回 JSON 或 XML |
| 是否需要视图解析器 | 需要 | 不需要 |
| 是否自动加 @ResponseBody | 否 | 是 |
如果你正在开发一个返回 JSON 数据的 RESTful API,推荐使用 @RestController;如果需要返回页面,则使用 @Controller。

浙公网安备 33010602011771号