點選上方藍色“後端面試那些事兒”,選擇“設為星标”
學最好的别人,做最好的我們

Spring MVC執行流程已是JAVA面試中老生常談的問題,相信各位小夥伴也是信手拈來。今天我們來談談另一個面試中必會必知的問題:@RestController 和 @Controller的差別?
- Spring MVC中的REST實作
- @[email protected]注解
- @RestController注解
Spring MVC 與 REST
基于注解的MVC架構簡化了建立RESTful web服務的過程。傳統的Spring MVC控制器和RESTful web服務控制器之間的關鍵差別是HTTP響應體的建立方式。傳統的MVC控制器依賴于視圖技術,基于REST的web服務控制器僅傳回對象,而對象資料直接以JSON/XML的形式寫入HTTP響應。
Spring MVC對 REST 的支援
支援以下方式來建立 REST 資源:
- 控制器可以處理所有的HTTP方法,包含四個主要的REST方法:GET、PUT、DELETE以及POST;
- 消息轉換器(Message conversion)将資源的JAVA表述形式轉換為發送給用戶端的表述形式;
- 借助于 SpringMVC 的一系列注解,建構 REST API;
- 借助 RestTemplate,Spring應用能夠友善地使用REST資源;
典型的Spring MVC工作流
典型的Spring MVC工作流程.png
在傳統的工作流中,ModelAndView對象是從控制器轉發到客戶機的,通過在方法上加@ResponseBody,Spring直接從控制器傳回資料,而不需要查找視圖。從4.0版本開始,随着@RestController注釋的引入,這個過程得到了進一步簡化。下面将解釋每種方法。
使用@Controller+ @ResponseBody注解
@Controller用于标記在一個類上,使用它标記的類就是一個Spring MVC Controller對象,分發處理器會掃描使用該注解的類的方法,并檢測該方法是否使用了@RequestMapping注解。
@ResponseBody注解用于将Controller的方法傳回的對象,通過适當的HttpMessageConverter轉換為指定格式後,寫入到Response對象的body資料區,通常用來傳回 JSON 或者 XML 資料,傳回 JSON 資料的情況比較多。
“
Spring有一個在背景注冊的HttpMessageConverters清單。HTTPMessageConverter的職責是根據預定義的mime類型将請求主體轉換為特定的類,然後再轉換回響應主體。每當發出的請求點選@ResponseBody時,Spring循環周遊所有已注冊的HttpMessageConverters,尋找第一個符合給定mime類型和類的請求,然後将其用于實際的轉換。
Spring3.x MVC RESTful網絡服務工作流程.png
代碼示例
建立實體類:
建立Controller:
“
在Spring配置檔案中添加
和 标簽,前者用于激活注釋并掃描包以查找和注冊應用程式上下文中的bean,後者增加了對讀取和寫入JSON/XML的支援(對于傳回JSON格式資料,需要導入jackson-databind依賴;對于XML格式,需要導入jaxb-api-osgi依賴)
使用URL:http://localhost:8687/week_1/dogs/哮天犬 ,輸出JSON:
傳回JSON格式資料.png
使用URL:http://localhost:8687/week_1/dogs/哮天犬.xml ,輸出XML:
傳回XML格式資料.png
使用@RestController注解
Spring 4.0引入了@RestController,@RestController 注解是一種快捷方式,它所聲明的控制器在傳回響應時,就如同使用了@ResponseBody 注解一樣。它會告訴Spring 将傳回類型序列化為合适的格式,預設情況下為JSON 格式。通過用@RestController注釋控制器類,您不再需要向所有請求映射方法添加@ResponseBody。
Spring4.x MVC RESTful網絡服務工作流程.png
要在我們的示例中使用@RestController,我們所需要做的就是将@Controller修改為@RestController并從每個方法中删除@ResponseBody。生成的類應該如下所示
“
注意,我們不再需要将@ResponseBody添加到請求映射方法中,在進行更改之後,再次在伺服器上運作應用程式會産生與之前相同的輸出。
總結
通過本篇的介紹,小夥伴們會發現使用@RestController非常簡單,是從Spring v4.0開始建立MVC RESTful web服務的首選方法。@RestController(Spring4+)相當于@[email protected],傳回json或者xml格式資料;如果在控制器類上使用@RestController來代替@Controller的話,Spring将會為該控制器的所有處理方法應用消息轉換功能,我們不必為每個方法都添加@ResponseBody了。
參考資料:
- 跟開濤學SpringMVC
- SpringMVC中Controller的@ResponseBody注解分析
- 【SpringBoot】 http請求注解之@RestController
- @RestController注解初步了解
- Spring Framework: @RestController vs. @Controller
作者 | Srivatsan Sundararajan
來源 | https://dzone.com/articles/spring-framework-restcontroller-vs-controller
翻譯 | laocaicaicai
往期推薦
ES 的分布式架構原理能說一下麼?
2020-08-01
面試 | 如何從大量的 URL 中找出相同的 URL?
2020-08-02
一個Java方法能使用多少個類型參數?
2020-07-31
字元串拼接,什麼時候用StringBuilder?
2020-07-30
你要知道的 21 道軟體設計+面向對象的面試題 · 讨論
2020-07-29
一起進大廠,每日學幹貨
關注我,不迷路