@Controller 和 @RestController 区别
-
功能范畴:
@Controller
:用于定义一个控制器类,主要用于处理用户请求并返回视图(通常是HTML页面)。常常与 Spring MVC 的视图解析器一起使用。@RestController
:是一个特殊类型的控制器,用于返回数据而不是视图。它用于构建 RESTful Web 服务,返回 JSON、XML 或其他格式的数据。
-
返回值处理:
@Controller
的方法默认返回的是视图名。如果想返回 JSON 数据,需要额外使用@ResponseBody
注解。@RestController
是一个组合注解,实际上是@Controller
和@ResponseBody
的结合。使用@RestController
标注的类中的每个方法返回的数据会被自动序列化为 JSON(或其他格式),而不是视图名称。
使用 @Controller
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyController {
@GetMapping("/hello")
public String hello() {
return "hello"; // 返回视图名
}
}
使用 @RestController
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyRestController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!"; // 直接返回数据
}
}
为什么引入 @RestController
-
简化代码:
@RestController
减少了在使用@Controller
时必须显式添加@ResponseBody
注解的需求,使代码更简洁清晰。 -
清晰的意图:使用
@RestController
明确表示该类的目的是为了提供 RESTful API,使得代码的可读性更强。 -
语义的明确:在 RESTful 开发中,使用
@RestController
提供一种语义上的约定,帮助其他开发者快速理解这个控制器的角色和所期望的返回格式。
何时使用
- 当你需要返回视图(HTML 页面)时,使用
@Controller
。 - 当你构建 RESTful Web 服务,并且需要返回 JSON 或 XML 数据时,应使用
@RestController
。