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