@RestController
和 @Controller
都是 Spring Framework 中用于定义控制器(Controller)的注解,但它们之间有一些关键的区别。
-
用途和返回类型:
@Controller
:这是一个基础的注解,用于标记一个类作为 Spring MVC 控制器。使用@Controller
注解的类中的方法通常返回String
类型的视图名称,该名称对应于视图解析器(如 JSP、Thymeleaf 等)可以解析的视图。@RestController
:这是@Controller
和@ResponseBody
的组合。它用于创建 RESTful Web 服务。使用@RestController
注解的类中的方法默认将返回值写入 HTTP 响应体中,并且这些方法通常返回ResponseEntity
、ResponseEntity<?>
、HttpEntity<?>
、Callable<?>
、DeferredResult<?>
、HttpHeaders
、HttpStatus
、HttpEntityStatusCodeException
、ResponseBodyEmitter
、SseEmitter
、AsyncResult
、ListenableFuture
、CompletionStage
、CompletableFuture
或WebAsyncTask
等。但是,对于简单的返回值(如 String、JSON、XML 等),你也可以直接返回它们,并且 Spring 会自动使用HttpMessageConverter
将其写入 HTTP 响应体。
-
响应体处理:
- 使用
@Controller
注解的控制器方法需要显式地使用@ResponseBody
注解来指示返回值应该写入 HTTP 响应体。 - 使用
@RestController
注解的控制器方法则不需要这样做,因为@RestController
已经隐含了@ResponseBody
的功能。
- 使用
-
默认行为:
- 如果你在一个类上同时使用了
@Controller
和@ResponseBody
,那么该类实际上与仅使用@RestController
是一样的。但是,为了代码的清晰性和可维护性,通常建议只使用其中一个。 - 使用
@RestController
通常是为了快速构建 RESTful Web 服务,而使用@Controller
则是为了构建更传统的基于视图的 MVC Web 应用程序。
- 如果你在一个类上同时使用了
-
其他注解:
- 除了
@Controller
和@RestController
之外,Spring 还提供了其他控制器注解,如@RequestMapping
、@GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
、@PatchMapping
等,用于映射 HTTP 请求到特定的处理方法。这些注解可以与@Controller
或@RestController
一起使用。
- 除了
总之,选择使用 @Controller
还是 @RestController
取决于你的应用程序类型和你想要实现的功能。如果你正在构建 RESTful Web 服务,那么 @RestController
可能是更好的选择。如果你正在构建基于视图的 MVC Web 应用程序,那么 @Controller
可能是更好的选择。