继续前面的学习
先看看WebHandler
从前面的过程中我们知道,HttpHandler将Request请求最后交给了WebHandler去处理,我们先简单学习一下WebHandler的实现类
WebHandler实现类
在WebHandler的实现类里面包含了一个装饰器对象WebHandlerDecorator,HttpWebHandlerAdapter也是继承自它
ExceptionHandlingWebHandler
WebHandler装饰器调用一个或多个WebExceptionHandlers处理webHandle过程中的错误
1 | @Override |
- 调用父级的去处理请求
- 发生异常后进行异常解析
FilteringWebHandler
FilteringWebHandler使用一个WebFilterChain去处理ServerWebExchange
1 | private final DefaultWebFilterChain chain; |
1 | @Override |
这里的handle实际上是DispatcherHandler
DispatcherHandler
DispatcherHandler应该是WebFlux核心的对象,在这里完成了对请求的处理。
1 | @Override |
- 将handlerMappings打包成一个广播对象
- 使用concatMap操作符收集
mapping.getHandler(exchange)
返回的对象。具体Handle过程我们后面再看。 - next()取出第一个对象
- 如果没有找到映射函数就广播一个异常Mono
- 调用业务代码函数处理请求
- 对业务代码结果进行处理
从WebHandlerDecorator开始
SpringWebFlux是怎么将这个过程串起来的呢?
首先,HttpWebHandlerAdapter将请求委派给 ExceptionHandlingWebHandler,ExceptionHandlingWebHandler收集并处理过程中的异常,它使用FilteringWebHandler来处理ServerWebExchange。
FilteringWebHandler本身也不处理ServerWebExchange,继续将任务交给了DispatcherHandler去执行。