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