为什么 Spring 5 webflux 中有 HandlerFunction?

Kay*_*ayV 4 reactive-streams spring-webflux

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

并根据文件:

处理函数的注释对应部分是带有 @RequestMapping 的方法。

既然@RequestMapping非常容易处理、实现和理解,那么为什么需要更复杂和更困难的方法来通过这个 HandlerFunctions 和 RouterFunction 实用程序来处理 Http 请求和响应呢?

请建议。

Bri*_*zel 7

Spring WebFlux 为您提供了两种不同的风格:注释式和函数式。

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

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

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

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

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

有关更多信息,您可以查看Arjen Poutsma 关于 Spring WebFlux 中的函数式 Web 框架的演讲