Springboot中Controller和RestController的使用及区别
作者:IT小鸟鸟
文章总结了Spring框架中@Controller和@RestController的区别,包括它们的用途、工作机制、使用场景以及底层原理,文章指出,@Controller用于传统的SpringMVC应用,返回视图或数据(需@ResponseBody)
在 Spring 框架中,@Controller 和 @RestController 是用于处理 HTTP 请求的注解,但它们的用途和行为有显著区别:
1. 核心区别
@Controller
- 用于传统的 Spring MVC 应用,通常返回视图(View)(如 JSP、Thymeleaf 等)。
- 若需要返回数据(如 JSON/XML),需额外使用
@ResponseBody注解。
@RestController
- 是 Spring 4.0 引入的注解,专门用于构建 RESTful Web 服务,直接返回数据(JSON/XML)。
- 它本质上是
@Controller+@ResponseBody的组合,自动将返回值序列化为 HTTP 响应体。
2. 工作机制对比
@Controller
- 默认假设方法返回的是视图名称(View Name),由
ViewResolver解析为具体页面。 - 若要返回数据,需在方法上添加
@ResponseBody,此时会通过HttpMessageConverter将返回值转换为指定格式(如 JSON)。
@Controller
public class MyController {
@GetMapping("/page")
public String showPage() {
return "home"; // 返回视图 home.jsp(或类似)
}
@ResponseBody
@GetMapping("/data")
public User getUser() {
return new User("Alice"); // 返回 JSON 数据
}
}@RestController
- 所有方法默认添加了
@ResponseBody,直接返回数据,无需视图解析。 - 适合 API 开发,不涉及页面渲染。
@RestController
public class MyRestController {
@GetMapping("/api/user")
public User getUser() {
return new User("Bob"); // 自动转换为 JSON
}
}3. 使用场景
@Controller
- 适用于需要混合视图和少量数据返回的传统 Web 应用(如前后端未分离的场景)。
@RestController
- 专为 RESTful API 设计,适用于前后端分离架构,仅返回数据(如 JSON/XML)。
4. 底层原理
- @Controller 依赖
ViewResolver解析视图,而 @RestController 依赖HttpMessageConverter转换数据。 - @RestController 的源码定义如下,可以看出它是
@Controller的增强版:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {}总结
| 特性 | @Controller | @RestController |
|---|---|---|
| 返回类型 | 视图(默认)或数据(需 @ResponseBody) | 直接返回数据 |
| 适用场景 | 传统 MVC 页面渲染 | RESTful API |
| 依赖组件 | ViewResolver | HttpMessageConverter |
| 注解组合 | 无 | @Controller + @ResponseBody |
根据项目需求选择注解:
需要页面渲染用 @Controller,纯 API 服务用 @RestController。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- SpringBoot @RestController注解用法及说明
- SpringBoot中@RestControllerAdvice 全局异常处理的实现
- springboot的统一异常处理,使用@RestControllerAdvice详解
- SpringBoot项目中@RestControllerAdvice全局异常失效问题的解决
- springboot中@RestController注解实现
- SpringBoot使用@RestController处理GET和POST请求的代码详解
- SpringBoot中@RestControllerAdvice @ExceptionHandler异常统一处理类失效原因分析
