Springboot中Controller和RestController的使用及區(qū)別
在 Spring 框架中,@Controller 和 @RestController 是用于處理 HTTP 請(qǐng)求的注解,但它們的用途和行為有顯著區(qū)別:
1. 核心區(qū)別
@Controller
- 用于傳統(tǒng)的 Spring MVC 應(yīng)用,通常返回視圖(View)(如 JSP、Thymeleaf 等)。
- 若需要返回?cái)?shù)據(jù)(如 JSON/XML),需額外使用
@ResponseBody注解。
@RestController
- 是 Spring 4.0 引入的注解,專門用于構(gòu)建 RESTful Web 服務(wù),直接返回?cái)?shù)據(jù)(JSON/XML)。
- 它本質(zhì)上是
@Controller+@ResponseBody的組合,自動(dòng)將返回值序列化為 HTTP 響應(yīng)體。
2. 工作機(jī)制對(duì)比
@Controller
- 默認(rèn)假設(shè)方法返回的是視圖名稱(View Name),由
ViewResolver解析為具體頁(yè)面。 - 若要返回?cái)?shù)據(jù),需在方法上添加
@ResponseBody,此時(shí)會(huì)通過(guò)HttpMessageConverter將返回值轉(zhuǎn)換為指定格式(如 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 數(shù)據(jù)
}
}@RestController
- 所有方法默認(rèn)添加了
@ResponseBody,直接返回?cái)?shù)據(jù),無(wú)需視圖解析。 - 適合 API 開(kāi)發(fā),不涉及頁(yè)面渲染。
@RestController
public class MyRestController {
@GetMapping("/api/user")
public User getUser() {
return new User("Bob"); // 自動(dòng)轉(zhuǎn)換為 JSON
}
}3. 使用場(chǎng)景
@Controller
- 適用于需要混合視圖和少量數(shù)據(jù)返回的傳統(tǒng) Web 應(yīng)用(如前后端未分離的場(chǎng)景)。
@RestController
- 專為 RESTful API 設(shè)計(jì),適用于前后端分離架構(gòu),僅返回?cái)?shù)據(jù)(如 JSON/XML)。
4. 底層原理
- @Controller 依賴
ViewResolver解析視圖,而 @RestController 依賴HttpMessageConverter轉(zhuǎn)換數(shù)據(jù)。 - @RestController 的源碼定義如下,可以看出它是
@Controller的增強(qiáng)版:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {}總結(jié)
| 特性 | @Controller | @RestController |
|---|---|---|
| 返回類型 | 視圖(默認(rèn))或數(shù)據(jù)(需 @ResponseBody) | 直接返回?cái)?shù)據(jù) |
| 適用場(chǎng)景 | 傳統(tǒng) MVC 頁(yè)面渲染 | RESTful API |
| 依賴組件 | ViewResolver | HttpMessageConverter |
| 注解組合 | 無(wú) | @Controller + @ResponseBody |
根據(jù)項(xiàng)目需求選擇注解:
需要頁(yè)面渲染用 @Controller,純 API 服務(wù)用 @RestController。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot @RestController注解用法及說(shuō)明
- SpringBoot中@RestControllerAdvice 全局異常處理的實(shí)現(xiàn)
- springboot的統(tǒng)一異常處理,使用@RestControllerAdvice詳解
- SpringBoot項(xiàng)目中@RestControllerAdvice全局異常失效問(wèn)題的解決
- springboot中@RestController注解實(shí)現(xiàn)
- SpringBoot使用@RestController處理GET和POST請(qǐng)求的代碼詳解
- SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處理類失效原因分析
相關(guān)文章
Java Buffer緩沖區(qū)操作與內(nèi)存管理最佳實(shí)踐
Java NIO的Buffer是數(shù)據(jù)容器,管理堆/堆外內(nèi)存,具備position、limit、capacity三大屬性,支持讀寫切換,直接緩沖區(qū)I/O快但創(chuàng)建較慢,非直接緩沖區(qū)更易管理,根據(jù)場(chǎng)景選擇合適類型以優(yōu)化性能,本文給大家介紹Java Buffer緩沖區(qū)操作與內(nèi)存管理最佳實(shí)踐,感興趣的朋友一起看看吧2025-09-09
從入門到精通詳解Java中的RESTful接口開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了Java中的RESTful接口開(kāi)發(fā)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-12-12
淺談SpringMVC中Interceptor和Filter區(qū)別
這篇文章主要介紹了淺談SpringMVC中Interceptor和Filter區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
springboot使用@Slf4j進(jìn)行日志的記錄步驟詳解
這篇文章主要介紹了springboot使用@Slf4j進(jìn)行日志的記錄,使用@Slf4j的注解進(jìn)行日志記錄非常方便,本文給大家分享操作步驟,需要的朋友可以參考下2023-08-08
Spring中接口FactoryBean作用及說(shuō)明
這篇文章主要介紹了Spring中接口FactoryBean作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2026-05-05
MyBatis?Plus如何實(shí)現(xiàn)獲取自動(dòng)生成主鍵值
這篇文章主要介紹了MyBatis?Plus如何實(shí)現(xiàn)獲取自動(dòng)生成主鍵值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09

