Spring Webflux HttpHandler源码整理

HttpHandler的构造
  1. 自动启动配置类:HttpHandlerAutoConfiguration

    text 复制代码
    @Bean
    public HttpHandler httpHandler(ObjectProvider<WebFluxProperties> propsProvider) {
        HttpHandler httpHandler = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();
        WebFluxProperties properties = propsProvider.getIfAvailable();
        if (properties != null && StringUtils.hasText(properties.getBasePath())) {
            Map<String, HttpHandler> handlersMap = Collections.singletonMap(properties.getBasePath(), httpHandler);
            return new ContextPathCompositeHandler(handlersMap);
        }
       return httpHandler;
    }
  2. ApplicationContext.applicationContext

    text 复制代码
    获取spring容器中的WebHandler并保存到WebHttpHandlerBuilder中 (这里传入的WebHandler为DispatcherHandler实例)
    获取spring容器中的WebFilter并保存到WebHttpHandlerBuilder中
    获取spring容器中的WebExceptionHandler并保存到WebHttpHandlerBuilder中
    获取spring容器中的HttpHandlerDecoratorFactory并保存到WebHttpHandlerBuilder中
    获取spring容器中WebSessionManager并保存到WebHttpHandlerBuilder中
    ...
  3. WebHttpHandlerBuilder#build构建HttpHandler

    text 复制代码
    public HttpHandler build() {
       WebHandler decorated = new FilteringWebHandler(this.webHandler, this.filters);
       decorated = new ExceptionHandlingWebHandler(decorated,  this.exceptionHandlers);
       HttpWebHandlerAdapter adapted = new HttpWebHandlerAdapter(decorated);
       adapted.setSessionManager(this.sessionManager);
       adapted.setCodecConfigurer(this.codecConfigurer);
       adapted.setLocaleContextResolver(this.localeContextResolver);
       adapted.setForwardedHeaderTransformer(this.forwardedHeaderTransformer);
       adapted.setApplicationContext(this.applicationContext);
       adapted.afterPropertiesSet();
       return (this.httpHandlerDecorator != null ? this.httpHandlerDecorator.apply(adapted) : adapted);
    }
  4. 实例化FilteringWebHandler

    text 复制代码
    public FilteringWebHandler(WebHandler handler, List<WebFilter> filters) {
        this.delegate = handler;
        this.chain = new DefaultWebFilterChain(handler, filters);
    }
  5. 实例化DefaultWebFilterChain

    text 复制代码
    public DefaultWebFilterChain(WebHandler handler, List<WebFilter> filters) {
         this.allFilters = Collections.unmodifiableList(filters);
         this.handler = handler;
         DefaultWebFilterChain chain = initChain(filters, handler);
         this.currentFilter = chain.currentFilter;
         this.chain = chain.chain;
     }
  6. initChain代码片段

    text 复制代码
     private static DefaultWebFilterChain initChain(List<WebFilter> filters, WebHandler handler) {
         DefaultWebFilterChain chain = new DefaultWebFilterChain(filters, handler, null, null);
         ListIterator<? extends WebFilter> iterator = filters.listIterator(filters.size());
         while (iterator.hasPrevious()) {
             chain = new DefaultWebFilterChain(filters, handler, iterator.previous(), chain);
         }
         return chain;
     }
HttpHandler的执行
  1. HttpWebHandlerAdapter#handle执行

    text 复制代码
    public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
       ServerWebExchange exchange = createExchange(request, response);
       return getDelegate().handle(exchange)
           .doOnSuccess(aVoid -> logResponse(exchange))
           .onErrorResume(ex -> handleUnresolvedError(exchange, ex))
           .then(Mono.defer(response::setComplete));
    }
  2. ExceptionHandlingWebHandler#handle(exchange)执行

    text 复制代码
    public Mono<Void> handle(ServerWebExchange exchange) {
         Mono<Void> completion;
         try {
             completion = super.handle(exchange);
         }catch (Throwable ex) {
             completion = Mono.error(ex);
         }
         for (WebExceptionHandler handler : this.exceptionHandlers) {
             completion = completion.onErrorResume(ex -> handler.handle(exchange, ex));
         }
         return completion;
    }
  3. FilteringWebHandler#handle

    text 复制代码
    public Mono<Void> handle(ServerWebExchange exchange) {
      return this.chain.filter(exchange);
    }
  4. DefaultWebFilterChain#filter执行

    text 复制代码
     public Mono<Void> filter(ServerWebExchange exchange) {
         return Mono.defer(() ->
              this.currentFilter != null && this.chain != null ?
                   invokeFilter(this.currentFilter, this.chain, exchange) :
                   this.handler.handle(exchange));
     }
     private Mono<Void> invokeFilter(WebFilter current, DefaultWebFilterChain chain, ServerWebExchange exchange) {
         String currentName = current.getClass().getName();
         return current.filter(exchange, chain).checkpoint(currentName + " [DefaultWebFilterChain]");
     }
  5. DispatcherHandler#handle执行

相关推荐
晴虹1 分钟前
lecen:一个更好的开源可视化系统搭建项目--组件和功能按钮的权限控制--全低代码|所见即所得|利用可视化设计器构建你的应用系统-做一
前端·后端·低代码
帅气的你1 分钟前
从零封装一个通用的 API 接口返回类:统一前后端交互格式
java·设计模式
Java编程爱好者3 分钟前
Java 并发编程:JUC 包中原子操作类的原理和用法
后端
qq_178057073 分钟前
基于minio实现的分片上传-支持断点续传
java
爱分享的鱼鱼3 分钟前
Pinia 深度解析:现代Vue应用状态管理最佳实践
前端·后端
JOEH605 分钟前
🚀 别再用 Future.get() 傻等了!CompletableFuture 异步编排实战,性能提升 300%!
后端·程序员
高山上有一只小老虎6 分钟前
灵异背包?
java·算法
码农水水7 分钟前
大疆Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·面试·职场和发展·单元测试·php
神奇小汤圆8 分钟前
原来可以搭建一个HTTP服务
后端
Hooray119 分钟前
前后端分离_案例学习_Python+Flask+VUE3
后端·python·学习·flask