在 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
。