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