我想参与 Spring 的反应式编程世界。正如我所意识到的,它让我可以在两种不同的范式之间进行选择:基于注释的(我们熟知的@Controller
)@RequestMapping
和反应式的(旨在解决“注释地狱”)。
我的问题是缺乏对典型反应式控制器的理解。我可以在我的控制器类中使用三个概念接口:
HandlerFunction<T>
(1) - 我为每个ServerRequest
返回具体HandlerFunction<T>
实例的特定方法定义一个方法,然后将这些方法注册到路由器。正确的?
RouterFunction
(2) 和FilterFunction
(3) - 是否有一个特定的位置应该放置所有RequestPredicate
具有相应s 的 s?HandlerFunction
或者我可以在每个控制器中单独做(就像我以前用注释方法做的那样)?如果是这样,那么如何通知全局处理程序(路由器,如果有的话?)从这个控制器应用这个路由器部分?
这就是我现在看到反应式控制器“模板”的方式:
public class Controller {
// handlers
private HandlerFunction<ServerResponse> handleA() {
return request -> ok().body(fromObject("a"));
}
// router
public RouterFunction<?> getRouter() {
return route(GET("/a"), handleA()).and(
route(GET("/b"), handleB()));
}
// filter
public RouterFunction<?> getFilter() {
return route(GET("/c"), handleC()).filter((request, next) -> next.handle(request));
}
}
最后,如何说它是一个控制器,而不用注释标记它?
我已经阅读了官方博客上的 Spring 参考资料和所有与此问题相关的帖子。有很多示例,但是所有示例都脱离了上下文(恕我直言),我无法将它们组装成完整的图片。
如果您能提供一个真实的示例和如何组织这些功能之间的交互的良好实践,我将不胜感激。