Spring中@Controller和@RestControlle注解的区别
在Spring框架中,@Controller和@RestController都是用于处理HTTP请求的注解,但它们在使用方式和返回类型上有显著区别。
1.@Controller
- 用途:传统的Spring MVC控制器,通常用于返回视图(如JSP、Thymeleaf等),但也可以返回数据(需配合 @ResponseBody)。
- 返回类型:
- 默认返回视图名称(由视图解析器渲染为HTML页面)。
- 若需返回JSON/XML等数据,需在方法上额外添加@ResponseBody注解。
- 适用场景:需要服务端渲染页面(SSR)或混合返回视图和数据的场景。
示例代码:
@Controller
@RequestMapping("/web")
public class WebController {// 返回视图名称(渲染为HTML)@GetMapping("/home")public String home() {return "home-page"; // 对应src/main/resources/templates/home-page.html}// 返回JSON数据(需@ResponseBody)@ResponseBody@GetMapping("/data")public User getUser() {return new User("Alice", 25);}
}
2.@RestController
- 用途:专为RESTful API设计,所有方法默认返回数据(JSON/XML),而非视图。
- 本质:是 @Controller 和 @ResponseBody 的组合注解(即所有方法自动添加@ResponseBody)。
- 适用场景:纯API服务(前后端分离架构),无需视图渲染。
示例代码:
@RestController
@RequestMapping("/api")
public class ApiController {// 自动返回JSON(无需@ResponseBody)@GetMapping("/user")public User getUser() {return new User("Bob", 30);}// 直接返回字符串@GetMapping("/hello")public String sayHello() {return "Hello, World!";}
}
3.关键区别总结
特性 | @Controller | @RestController |
---|---|---|
默认返回类型 | 视图名称 | 数据(自动@ResponseBody) |
组合注解 | 无 | @Controller + @ResponseBody |
适用场景 | 服务端渲染(SSR)或混合应用 | 纯REST API(前后端分离) |
是否需要@ResponseBody | 需要(返回数据时) | 不需要(已内置) |
如何选择?
- 如果开发传统Web应用(含页面渲染),使用@Controller。
- 如果开发纯API服务(如React/Vue前端调用),使用@RestController。
通过理解两者的差异,可以更高效地设计Spring应用的架构。