Spring WebFlux 与 Spring MVC 类似,是围绕前端控制器模式设计的,
其中,中央 、 、 为
请求处理,而实际工作由可配置的委托组件执行。
此模型非常灵活,并支持多种工作流。WebHandlerDispatcherHandler
DispatcherHandler从 Spring 配置中发现它需要的 delegate 组件。
它还被设计为 Spring Bean 本身,并实现对运行它的上下文的访问。If 是使用 Bean 声明的
name 的 ,它反过来又被 WebHttpHandlerBuilder 发现,
它把一个请求处理链放在一起,如 WebHandler API 中所述。ApplicationContextAwareDispatcherHandlerwebHandler
WebFlux 应用程序中的 Spring 配置通常包含:
- 
DispatcherHandler替换为 bean 名称webHandler - 
WebFilter和BeansWebExceptionHandler - 
别人
 
配置用于构建处理链,
如下例所示:WebHttpHandlerBuilder
- 
Java
 - 
Kotlin
 
ApplicationContext context = ...
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context).build();
val context: ApplicationContext = ...
val handler = WebHttpHandlerBuilder.applicationContext(context).build()
结果已准备好与服务器适配器一起使用。HttpHandler
特殊 Bean 类型
委托给特殊 bean 来处理请求并呈现
适当的回应。我们所说的“特殊 bean”是指 Spring 管理的实例,这些实例
实现 WebFlux 框架 Contract。这些通常带有内置合约,但
您可以自定义、扩展或替换其属性。DispatcherHandlerObject
下表列出了 检测到的特殊 bean。请注意,
还有一些其他 bean 在较低级别检测到(参见 Web 处理程序 API 中的特殊 bean 类型)。DispatcherHandler
| Bean 类型 | 解释 | 
|---|---|
  | 
将请求映射到处理程序。映射基于一些标准,详细信息
 因实现而异 — 带注释的控制器、简单的
 URL 模式映射等。 主要实现用于带 Comments 的方法,用于功能端点
 routes,以及 URI 路径模式的显式注册
 和实例。  | 
  | 
帮助 调用映射到请求的处理程序,而不管
 处理程序的实际调用方式。例如,调用带注释的控制器
 需要解析注释。a 的主要目的是屏蔽这些细节。  | 
  | 
处理处理程序调用的结果并完成响应。 请参阅 结果处理。  | 
| Bean 类型 | 解释 | 
|---|---|
  | 
将请求映射到处理程序。映射基于一些标准,详细信息
 因实现而异 — 带注释的控制器、简单的
 URL 模式映射等。 主要实现用于带 Comments 的方法,用于功能端点
 routes,以及 URI 路径模式的显式注册
 和实例。  | 
  | 
帮助 调用映射到请求的处理程序,而不管
 处理程序的实际调用方式。例如,调用带注释的控制器
 需要解析注释。a 的主要目的是屏蔽这些细节。  | 
  | 
处理处理程序调用的结果并完成响应。 请参阅 结果处理。  | 
WebFlux 配置
应用程序可以声明处理请求所需的基础结构 Bean(列在 Web Handler API 和 DispatcherHandler 下)。
但是,在大多数情况下,WebFlux Config 是最好的起点。它声明
所需的 bean,并提供更高级别的配置回调 API 来自定义它。
| Spring Boot 依赖于 WebFlux 配置来配置 Spring WebFlux,并且还提供 许多额外的方便选择。 | 
| Spring Boot 依赖于 WebFlux 配置来配置 Spring WebFlux,并且还提供 许多额外的方便选择。 | 
加工
DispatcherHandler按如下方式处理请求:
- 
要求每个 Bean 查找匹配的处理程序,并使用第一个匹配项。
HandlerMapping - 
如果找到处理程序,则通过适当的 运行该处理程序 ,该 将执行的返回值公开为 。
HandlerAdapterHandlerResult - 
该 被 交给 一个 适当 的 完成 通过直接写入响应或使用 View 进行渲染来进行处理。
HandlerResultHandlerResultHandler 
结果处理
通过 , 调用处理程序的返回值被包装
作为 ,以及一些额外的上下文,并传递给第一个声称支持它的 Context。下表显示了可用的实现,所有这些实现都在 WebFlux Config 中声明:HandlerAdapterHandlerResultHandlerResultHandlerHandlerResultHandler
| 结果处理程序类型 | 返回值 | 默认订单 | 
|---|---|---|
  | 
  | 
0  | 
  | 
  | 
0  | 
  | 
处理方法或类的返回值。  | 
100  | 
  | 
 另请参阅 View Resolution。  | 
  | 
| 结果处理程序类型 | 返回值 | 默认订单 | 
|---|---|---|
  | 
  | 
0  | 
  | 
  | 
0  | 
  | 
处理方法或类的返回值。  | 
100  | 
  | 
 另请参阅 View Resolution。  | 
  | 
异常
HandlerAdapter实现可以在内部处理调用请求的异常
处理程序,例如 Controller 方法。但是,如果请求
handler 返回一个异步值。
A 可以在它返回的 A 上将其异常处理机制公开为 set。设置后,也会将其应用于结果的处理。HandlerAdapterDispatchExceptionHandlerHandlerResultDispatcherHandler
A 也可以选择实现 .在这种情况下,会将其应用于在映射处理程序之前出现的异常,
例如,在处理程序映射期间,或更早的时候,例如在 .HandlerAdapterDispatchExceptionHandlerDispatcherHandlerWebFilter
View 分辨率
视图分辨率允许使用 HTML 模板和模型呈现到浏览器,而无需
将您与特定的 View 技术联系起来。在 Spring WebFlux 中,视图分辨率为
通过专用的 HandlerResultHandler 提供支持,该 HandlerResultHandler 使用实例将 String(表示逻辑视图名称)映射到实例。然后,使用 the 来呈现响应。ViewResolverViewView
处理
传入的 include 包含返回值
从处理程序和包含请求期间添加的属性的模型
处理。返回值将作为以下值之一进行处理:HandlerResultViewResolutionResultHandler
- 
String, : 要解析为 through 的逻辑视图名称 已配置的 implementations 列表。CharSequenceViewViewResolver - 
void:根据请求路径选择默认视图名称,减去前导和 尾部斜杠,并将其解析为 .当视图名称 未提供(例如,返回 model 属性)或异步返回值 (例如,completed empty)。ViewMono - 
渲染:API for 查看解决方案。探索 IDE 中的代码完成选项。
 - 
Model, : 要添加到请求模型的额外模型属性。Map - 
任何其他:任何其他返回值(简单类型除外,由 BeanUtils#isSimpleProperty 确定) 被视为要添加到模型的 model 属性。属性名称是派生的 从类名中通过使用约定, 除非存在 Handler Method 注解。
@ModelAttribute 
该模型可以包含异步的反应式类型(例如,来自 Reactor 或 RxJava)。事先
进行渲染,将此类模型属性解析为具体值
并更新模型。单值响应式类型被解析为单个
value 或no value (如果为空),而多值响应式类型(例如 )是
收集并解析为 。AbstractViewFlux<T>List<T>
配置视图分辨率就像添加 bean 一样简单
添加到您的 Spring 配置中。WebFlux Config 提供了一个
用于视图解析的专用配置 API。ViewResolutionResultHandler
有关与 Spring WebFlux 集成的视图技术的更多信息,请参见View Technologies。
重 定向
视图名称中的特殊前缀允许您执行重定向。(和子类)将此视为一个指令,即
redirect 是必需的。视图名称的其余部分是重定向 URL。redirect:UrlBasedViewResolver
实际效果与控制器返回 或 相同,但现在控制器本身可以
根据逻辑视图名称进行操作。视图名称 (例如)是相对于当前应用程序的,而视图名称 (例如)重定向到绝对 URL。RedirectViewRendering.redirectTo("abc").build()redirect:/some/resourceredirect:https://example.com/arbitrary/path
内容协商
ViewResolutionResultHandler支持内容协商。它比较请求
媒体类型,其中包含每个选定 .使用第一个支持请求的媒体类型的媒体。ViewView
为了支持 JSON 和 XML 等媒体类型, Spring WebFlux 提供了,这是一种通过 HttpMessageWriter 呈现的特殊功能。通常,您会将这些配置为默认
视图。默认视图为
如果它们与请求的媒体类型匹配,则始终选中并使用。HttpMessageWriterViewView