|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
DispatcherHandler
Spring WebFlux,类似于Spring MVC,是围绕前端控制器模式设计的,
其中中央WebHandler,即DispatcherHandler,为请求处理提供了一个共享算法,
而实际工作由可配置的委托组件完成。这种模型非常灵活,支持多种工作流程。
DispatcherHandler 从 Spring 配置中发现它需要的委托组件。
它也被设计为一个 Spring bean,并实现了 ApplicationContextAware,
以便访问其运行的上下文。如果 DispatcherHandler 声明为具有 bean 名称 webHandler,
则它反过来会被 WebHttpHandlerBuilder 发现,
后者将组件组合成一个请求处理链,如 WebHandler API 中所述。
在WebFlux应用程序中,Spring配置通常包含:
-
DispatcherHandler具有 bean 名称webHandler -
WebFilter和WebExceptionHandlerbeans -
其他人
配置被赋予WebHttpHandlerBuilder以构建处理链,
如下例所示:
-
Java
-
Kotlin
ApplicationContext context = ...
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context).build();
val context: ApplicationContext = ...
val handler = WebHttpHandlerBuilder.applicationContext(context).build()
结果的 HttpHandler 已准备好与 服务器适配器 一起使用。
特殊bean类型
The DispatcherHandler 委托给特殊 bean 来处理请求并渲染适当的响应。所谓的“特殊 bean”是指实现了 WebFlux 框架契约的 Spring 管理的 Object 实例。这些通常带有内置契约,但您可以自定义它们的属性、扩展它们或替换它们。
以下表格列出了由DispatcherHandler检测到的特殊bean。请注意,还有一些在较低级别检测到的其他bean(请参见Web Handler API中的特殊bean类型)。
| Beans类型 | 说明 |
|---|---|
|
将请求映射到处理器。映射基于某些标准,具体细节因 主要的 |
|
帮助 |
|
处理处理器调用的结果并最终确定响应。 见结果处理。 |
WebFlux配置
应用程序可以声明处理请求所需的基础设施bean(列在Web Handler API和DispatcherHandler下)。但是,在大多数情况下,WebFlux Config是最好的起点。它声明了所需的bean,并提供了一个更高层次的配置回调API来定制它。
| Spring Boot 依赖于 WebFlux 配置来配置 Spring WebFlux,并且还提供了许多额外的便捷选项。 |
处理
DispatcherHandler 处理请求如下:
-
每个
HandlerMapping都会被要求找到一个匹配的处理器,并且使用第一个匹配项。 -
如果找到了处理器,它将通过适当的
HandlerAdapter运行,该HandlerAdapter会将执行的返回值暴露为HandlerResult。 -
The
HandlerResultis given to an appropriateHandlerResultHandlerto complete processing by writing to the response directly or by using a view to render.
结果处理
通过调用处理器返回的值,通过一个HandlerAdapter,被包装为一个HandlerResult,并附带一些额外的上下文信息,传递给第一个声明支持它的HandlerResultHandler。下表列出了可用的HandlerResultHandler实现,所有这些实现都在WebFlux Config中声明:
| 结果处理器类型 | 返回值 | 默认顺序 |
|---|---|---|
|
|
0 |
|
|
0 |
|
处理从 |
100 |
|
另请参见 查看解决方案。 |
|
异常
HandlerAdapter 实现可以在内部处理来自调用请求处理器(例如控制器方法)的异常。但是,如果请求处理器返回异步值,则异常可能会被延迟。
HandlerAdapter 可能会将其异常处理机制公开为返回的 HandlerResult 上的一个 DispatchExceptionHandler 集合。当设置了该机制时,DispatcherHandler 也会将其应用于结果的处理过程。
HandlerAdapter 也可以选择实现 DispatchExceptionHandler。在这种情况下,DispatcherHandler 会将其应用于处理器映射之前出现的异常,例如在映射处理器期间或更早,例如在 WebFilter 中。
另请参阅 异常处理 章节中的“Annotated Controller”部分或 WebHandler API 部分的异常处理章节。
视图解析
视图解析功能允许使用HTML模板和模型向浏览器呈现,而无需绑定到特定的视图技术。在Spring WebFlux中,视图解析通过专用的HandlerResultHandler支持,该处理器使用ViewResolver实例将字符串(表示逻辑视图名称)映射到View实例。View然后用于渲染响应。
处理
传递给 ViewResolutionResultHandler 的 HandlerResult 包含处理器返回的值以及在请求处理期间添加的属性的模型。返回值将按以下方式之一进行处理:
-
String,CharSequence: 一个逻辑视图名称,通过配置的ViewResolver实现列表解析为View。 -
void: 根据请求路径选择一个默认视图名称,去掉前导和尾随斜杠,并将其解析为View。当未提供视图名称时(例如,返回了模型属性)或异步返回值为空时(例如,Mono完成为空),也会发生同样的情况。 -
渲染: API 用于视图解析场景。在您的 IDE 中使用代码补全来探索选项。
-
Model,Map: 为请求添加到模型中的额外模型属性。 -
其他任何:其他任何返回值(除了简单类型,由 BeanUtils#isSimpleProperty 确定) 被视为要添加到模型中的模型属性。属性名称通过使用 约定 从类名派生, 除非存在带有
@ModelAttribute注解的处理器方法。
模型可以包含异步、响应式类型(例如,来自Reactor或RxJava)。在渲染之前,AbstractView将这些模型属性解析为具体值并更新模型。单值响应式类型被解析为单个值或无值(如果为空),而多值响应式类型(例如,Flux<T>)被收集并解析为List<T>。
要配置视图解析,只需在您的Spring配置中添加一个ViewResolutionResultHandler bean。WebFlux 配置提供了一个专门的配置API用于视图解析。
See 视图技术 for more on the view technologies integrated with Spring WebFlux.
重定向
特殊前缀 redirect: 在视图名称中允许你执行重定向。UrlBasedViewResolver(及其子类)将此识别为需要重定向的指令。视图名称的其余部分是重定向URL。
最终效果与控制器返回RedirectView或Rendering.redirectTo("abc").build()相同,但现在控制器本身可以在逻辑视图名称的术语下操作。像redirect:/some/resource这样的视图名称相对于当前应用程序,而像redirect:https://example.com/arbitrary/path这样的视图名称重定向到绝对URL。
内容协商
ViewResolutionResultHandler 支持内容协商。它将请求的媒体类型与每个选定 View 支持的媒体类型进行比较。首先使用支持请求的媒体类型(s) 的 View。
为了支持JSON和XML等媒体类型,Spring WebFlux提供了HttpMessageWriterView,这是一种特殊的View,通过HttpMessageWriter进行渲染。通常,您会通过WebFlux配置将这些配置为默认视图。如果匹配请求的媒体类型,默认视图总是被选择和使用。