为什么 Spring 5 webflux 中有 HandlerFunctions?

Why are there HandlerFunctions in Spring 5 webflux?

我正在学习 spring 5 webflux 和反应流。并且有新的 HandlerFunctions 和 RouterFunctions 来实现 Http 请求和响应。

并根据文档:

The annotation counterpart to a handler function would be a method with @RequestMapping.

由于 @RequestMapping 很容易处理、实施和理解,那么为什么需要更复杂和困难的方法来通过此 HandlerFunctions 和RouterFunction 实用程序?

求推荐。

不需要,也不会破坏 webflux。我会使用 @RequestMapping,如果您没有特殊需要 HandlerFunction neccessary。

对于 RouterFunctions:如果您不想使用 JSON 解析,并且想直接修改 ServerRequest(例如,拥有原始 InputStream),则必须使用 RouterFunctions (AFAIK)。然后你也会 return 一个原始流 (Mono)。我有一个案例,我需要额外玩代理,因此需要避免 JSON 解析,你通常会用 @RequestMapping

Spring WebFlux 为您提供两种不同的样式:注释和功能。

根据您想要构建的应用程序类型,您必须处理的约束 - 一个或另一个可能更相关。您甚至可以在同一个应用程序中混合使用两者。

基于注释的模型非常成功,但它也有一些局限性,主要是因为 Java 注释本身:

  • 代码路径并不总是清晰的,除非您了解 Spring 框架的内部结构(您知道在哪里检测到处理程序映射吗?与传入请求匹配?)
  • 它使用的是反射,这是有代价的
  • 很难调试和扩展

函数式变体试图解决这些问题并采用函数式风格(使用 JDK8 函数 API)和不变性。它具有 "more library; less framework" 触感,这意味着您可以更好地控制事物。这是一个示例:使用 RouterFunction,您可以链接 RequestPredicates 并按顺序执行它们,因此您可以完全控制最终处理传入请求的内容。使用注释模型,将通过查看方法和传入请求上的注释来选择最具体的处理程序。

如果您对注释模型非常满意,则没有理由切换。但同样,您可以将两者混合使用,也许您会发现功能模型很方便。在我看来,即使您不打算采用它也不会受到伤害 - 最坏的情况是这会拓宽您作为开发人员的视野并向您展示一种不同的做事方式。

有关更多信息,您可以查看 Arjen Poutsma's talk on the functional web framework in Spring WebFlux