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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索