Spring 5.2.2 WebFlux 之 DispatcherHandler

     相似於Spring MVCSpring WebFlux是圍繞front controller模式設計的,其中主要的WebHandlerDispatcherHandler,爲請求處理提供了一個共享算法,而實際工做是由可配置的委託組件執行的。該模型具備靈活性,支持多種工做流。web

      DispatcherHandler 從Spring配置中發現它須要的代理組件。它自己也被設計成一個 Spring  bean,並實現了ApplicationContextAware 以訪問它運行的上下文。若是DispatcherHandler 是用一個bean名稱webHandler聲明的,那麼它又會被 WebHttpHandlerBuilder發現,它將一個請求處理鏈組合在一塊兒,如 WebHandler API中所述。算法

WebFlux應用程序中的Spring配置一般包含:sql

  1. 名爲webHandlerDispatcherHandler 瀏覽器

  2. WebFilter WebExceptionHandler bean服務器

  3. DispatcherHandler指定的bean微信

  4. 其它
    app

將配置提供給WebHttpHandlerBuilder 以構建處理流程,以下例所示:框架

ApplicationContext context = ...HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context).build();

生成的HttpHandler 能夠與服務器適配器一塊兒使用。異步

一、指定的Bean
函數

     DispatcherHandler委託給特殊的bean來處理請求並提供適當的響應。「指定bean」是指實現WebFlux框架契約的Spring託管Object實例。它們一般帶有內置的契約,但您能夠自定義它們的屬性、擴展它們或替換它們。

    下表列出了DispatcherHandler檢測到的指定bean。請注意,在較低級別上還檢測到其餘一些bean。

二、WebFlux配置

     應用程序能夠聲明處理請求所需的基礎結構bean(在Web處理程序API和 DispatcherHandler下)。然而,在大多數狀況下,WebFlux配置是最好的起點。它聲明所需的bean,並提供更高級別的配置回調API來定製它。

     Spring Boot依賴於WebFlux配置來配置Spring WebFlux,還提供了許多額外的方便選項。

三、處理請求

     DispatcherHandler 處理請求以下:

  1.     每一個HandlerMapping被要求查找匹配的處理程序,並使用第一個匹配項。

  2.     若是找處處理程序,則經過適當的HandlerAdapter執行它,該適配器將執行返回的值做爲HandlerResult公開。

  3.     HandlerResult 被提供給適當的HandlerResultHandler ,以便經過直接寫入響應或使用視圖呈現來完成處理。

四、處理結果

     經過HandlerAdapter調用處理程序的返回值被包裝爲HandlerResult和一些附加上下文,並傳遞給第一個聲稱支持它的HandlerResultHandler 。下表顯示了可用的HandlerResultHandler 實現,全部這些實現都在WebFlux配置中聲明:

五、異常處理

    從HandlerAdapter 返回的HandlerResult 能夠基於某些特定於處理程序的機制公開用於錯誤處理的函數。在如下狀況下調用此error函數:

  1.    處理程序(例如,@Controller)調用失敗。

  2.    經過HandlerResultHandler 處理處理程序返回值失敗。

只要在從處理程序返回的反應類型生成任何數據項以前出現錯誤信號,error函數就能夠更改響應(例如,更改成error狀態)。

     這就是支持@Controller類中的@ExceptionHandler方法的方法。相比之下,SpringMVC中對MVC的支持是創建在HandlerExceptionResolver上的。這一般不重要。可是,請記住,在WebFlux中,不能使用@ControllerAdvice來處理在選擇處理程序以前發生的異常。

六、視圖分辨率

     視圖分辨率容許使用HTML模板和模型在瀏覽器中進行渲染,而無需將您綁定到特定的視圖技術。在Spring WebFlux中,視圖解析是經過一個專用的 HandlerResultHandler來支持的,它使用ViewResolver 實例將一個字符串(表明一個邏輯視圖名)映射到一個View 實例。而後使用View 呈現響應。

     綁定

     傳遞給ViewResolutionResultHandler HandlerResult 包含處理程序的返回值和包含請求處理過程當中添加的屬性的模型。返回值按如下方式處理:

      StringCharSequence:要經過配置的ViewResolver 實現列表解析爲視圖的邏輯View 名稱。

       void:根據請求路徑選擇一個默認視圖名稱,減去前和後斜槓,而後將其解析爲View。若是沒有提供視圖名稱(例如,返回了model屬性)或異步返回值(例如,Mono completed empty),也會發生一樣的狀況。

       Rendering(渲染):視圖解析方案的API。使用代碼完成功能探索IDE中的選項。

       ModelMap:爲請求添加到模型中的額外模型屬性。

   Any other:任何其餘返回值(除了簡單類型,由BeanUtils#isSimpleProperty肯定)被視爲要添加到模型中的模型屬性。除非存在處理程序方法@ModelAttribute註解,不然屬性名是經過使用約定從類名派生的。

       model 能夠包含異步、反應類型(例如,來自Reactor或RxJava)。在呈現以前,AbstractView 將這些模型屬性解析爲具體的值並更新模型。單值無功類型解析爲單值或無值(若是爲空),而多值無功類型(例如,Flux<T>)將被收集並解析爲List<T>

     配置視圖解析很是簡單,只需在Spring配置中添加一個ViewResolutionResultHandler bean。WebFlux Config爲視圖解析提供了一個專用的配置API。

      重定向

   視圖名稱中的特殊重定向:前綴容許執行重定向。UrlBasedViewResolver (和子類)將其識別爲須要重定向的指令。視圖名稱的其他部分是重定向URL。

    淨效果與控制器返回RedirectView Rendering.redirectTo("abc").build(),但如今控制器自己能夠按邏輯視圖名稱進行操做。視圖名(如redirect:/some/resource)是相對於當前應用程序的,而視圖名(如redirect:https://example.com/arbitrary/path重定向到絕對URL。

      內容協議

      ViewResolutionResultHandler 支持內容協議。它將請求媒體類型與每一個選定View支持的媒體類型進行比較。將使用第一個支持請求的媒體類型的View

    爲了支持JSON和XML等媒體類型,Spring WebFlux提供了HttpMessageWriterView,這是一個經過HttpMessageWriter呈現的特殊View 。一般,你能夠經過WebFlux配置將這些配置爲默認視圖。若是默認視圖與請求的介質類型匹配,則始終選擇和使用默認視圖。

歡迎關注和轉發Spring中文社區(加微信羣,能夠關注後加我微信):


 

本文分享自微信公衆號 - Spring中文社區(gh_81d233bb13a4)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索