此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring Framework 6.1.13! |
此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring Framework 6.1.13! |
Spring WebFlux 与 Spring MVC 类似,是围绕前端控制器模式设计的,
其中,中央 、 、 为
请求处理,而实际工作由可配置的委托组件执行。
此模型非常灵活,并支持多种工作流。WebHandler
DispatcherHandler
DispatcherHandler
从 Spring 配置中发现它需要的 delegate 组件。
它还被设计为 Spring Bean 本身,并实现对运行它的上下文的访问。If 是使用 Bean 声明的
name 的 ,它反过来又被 WebHttpHandlerBuilder
发现,
它把一个请求处理链放在一起,如 WebHandler
API 中所述。ApplicationContextAware
DispatcherHandler
webHandler
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。这些通常带有内置合约,但
您可以自定义、扩展或替换其属性。DispatcherHandler
Object
下表列出了 检测到的特殊 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
-
如果找到处理程序,则通过适当的 运行该处理程序 ,该 将执行的返回值公开为 。
HandlerAdapter
HandlerResult
-
该 被 交给 一个 适当 的 完成 通过直接写入响应或使用 View 进行渲染来进行处理。
HandlerResult
HandlerResultHandler
结果处理
通过 , 调用处理程序的返回值被包装
作为 ,以及一些额外的上下文,并传递给第一个声称支持它的 Context。下表显示了可用的实现,所有这些实现都在 WebFlux Config 中声明:HandlerAdapter
HandlerResult
HandlerResultHandler
HandlerResultHandler
结果处理程序类型 | 返回值 | 默认订单 |
---|---|---|
|
|
0 |
|
|
0 |
|
处理方法或类的返回值。 |
100 |
|
另请参阅 View Resolution。 |
|
结果处理程序类型 | 返回值 | 默认订单 |
---|---|---|
|
|
0 |
|
|
0 |
|
处理方法或类的返回值。 |
100 |
|
另请参阅 View Resolution。 |
|
异常
HandlerAdapter
实现可以在内部处理调用请求的异常
处理程序,例如 Controller 方法。但是,如果请求
handler 返回一个异步值。
A 可以在它返回的 A 上将其异常处理机制公开为 set。设置后,也会将其应用于结果的处理。HandlerAdapter
DispatchExceptionHandler
HandlerResult
DispatcherHandler
A 也可以选择实现 .在这种情况下,会将其应用于在映射处理程序之前出现的异常,
例如,在处理程序映射期间,或者更早的时候,例如,在 .HandlerAdapter
DispatchExceptionHandler
DispatcherHandler
WebFilter
View 分辨率
视图分辨率允许使用 HTML 模板和模型呈现到浏览器,而无需
将您与特定的 View 技术联系起来。在 Spring WebFlux 中,视图分辨率为
通过专用的 HandlerResultHandler 提供支持,该 HandlerResultHandler 使用实例将 String(表示逻辑视图名称)映射到实例。然后,使用 the 来呈现响应。ViewResolver
View
View
Web 应用程序需要使用 View 渲染库来支持此用例。
处理
传入的 include 包含返回值
从处理程序和包含请求期间添加的属性的模型
处理。返回值将作为以下值之一进行处理:HandlerResult
ViewResolutionResultHandler
-
String
, : 要解析为 through 的逻辑视图名称 已配置的 implementations 列表。CharSequence
View
ViewResolver
-
void
:根据请求路径选择默认视图名称,减去前导和 尾部斜杠,并将其解析为 .当视图名称 未提供(例如,返回 model 属性)或异步返回值 (例如,completed empty)。View
Mono
-
渲染:API for 查看解决方案。探索 IDE 中的代码完成选项。
-
Model
, : 要添加到请求模型的额外模型属性。Map
-
任何其他:任何其他返回值(简单类型除外,由 BeanUtils#isSimpleProperty 确定) 被视为要添加到模型的 model 属性。属性名称是派生的 从类名中通过使用约定, 除非存在 Handler Method 注解。
@ModelAttribute
该模型可以包含异步的反应式类型(例如,来自 Reactor 或 RxJava)。事先
进行渲染,将此类模型属性解析为具体值
并更新模型。单值响应式类型被解析为单个
value 或no value (如果为空),而多值响应式类型(例如 )是
收集并解析为 。AbstractView
Flux<T>
List<T>
配置视图分辨率就像添加 bean 一样简单
添加到您的 Spring 配置中。WebFlux Config 提供了一个
用于视图解析的专用配置 API。ViewResolutionResultHandler
有关与 Spring WebFlux 集成的视图技术的更多信息,请参见View Technologies。
重 定向
视图名称中的特殊前缀允许您执行重定向。(和子类)将此视为一个指令,即
redirect 是必需的。视图名称的其余部分是重定向 URL。redirect:
UrlBasedViewResolver
实际效果与控制器返回 或 相同,但现在控制器本身可以
根据逻辑视图名称进行操作。视图名称 (例如)是相对于当前应用程序的,而视图名称 (例如)重定向到绝对 URL。RedirectView
Rendering.redirectTo("abc").build()
redirect:/some/resource
redirect:https://example.com/arbitrary/path
与 Servlet 堆栈不同,
Spring WebFlux 不支持“FORWARD”分派,因此不支持前缀。forward: |
内容协商
ViewResolutionResultHandler
支持内容协商。它比较请求
媒体类型,其中包含每个选定 .使用第一个支持请求的媒体类型的媒体。View
View
为了支持 JSON 和 XML 等媒体类型, Spring WebFlux 提供了,这是一种通过 HttpMessageWriter 呈现的特殊功能。通常,您会将这些配置为默认
视图。默认视图为
如果它们与请求的媒体类型匹配,则始终选中并使用。HttpMessageWriterView
View
与 Servlet 堆栈不同,
Spring WebFlux 不支持“FORWARD”分派,因此不支持前缀。forward: |