天天看點

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

點選上方藍色“後端面試那些事兒”,選擇“設為星标”

學最好的别人,做最好的我們

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

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工作流

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

典型的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類型和類的請求,然後将其用于實際的轉換。

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

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:

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

傳回JSON格式資料.png

使用URL:http://localhost:8687/week_1/dogs/哮天犬.xml ,輸出XML:

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

傳回XML格式資料.png

使用@RestController注解

Spring 4.0引入了@RestController,@RestController  注解是一種快捷方式,它所聲明的控制器在傳回響應時,就如同使用了@ResponseBody  注解一樣。它會告訴Spring 将傳回類型序列化為合适的格式,預設情況下為JSON 格式。通過用@RestController注釋控制器類,您不再需要向所有請求映射方法添加@ResponseBody。

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

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

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

往期推薦

ES 的分布式架構原理能說一下麼?

2020-08-01

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

面試 | 如何從大量的 URL 中找出相同的 URL?

2020-08-02

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

一個Java方法能使用多少個類型參數?

2020-07-31

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

字元串拼接,什麼時候用StringBuilder?

2020-07-30

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

你要知道的 21 道軟體設計+面向對象的面試題 · 讨論

2020-07-29

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

一起進大廠,每日學幹貨

關注我,不迷路

@controller注解_Spring 注解 @RestController 和 @Controller 面試必會必知

繼續閱讀