为什么Spring 5 webflux中有HandlerFunction?

时间:2018-01-02 07:24:16

标签: spring-webflux reactive-streams

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

并根据文件:

  

处理程序函数的注释对应方式是@RequestMapping的方法。

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

请建议。

2 个答案:

答案 0 :(得分:3)

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

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

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

  • 代码路径并不总是清晰的,除非你知道Spring Framework的内部结构(你知道检测到处理程序映射的位置吗?匹配传入的请求吗?)
  • 它使用的是反射,它有一个成本
  • 可能很难调试和扩展

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

如果您对注释模型非常满意,则无需切换。但同样,你可以将两者结合起来,也许你会找到方便的功能模型。在我看来,即使你不打算采用它也不会受到影响 - 最糟糕的情况是,这会扩大你作为开发人员的观点并向你展示不同的做事方式。

有关详情,请查看Arjen Poutsma's talk on the functional web framework in Spring WebFlux

答案 1 :(得分:0)

不需要,也不会破坏webflux。我使用@RequestMapping,如果你没有特殊需要,那么HandlerFunction是必要的。

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