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执行

相关推荐
A尘埃13 小时前
智慧零售全渠道业务中台系统
java·零售
尘鹄14 小时前
go 初始化组件最佳实践
后端·设计模式·golang
墩墩分墩14 小时前
【Go语言入门教程】 Go语言的起源与技术特点:从诞生到现代编程利器(一)
开发语言·后端·golang·go
程序员爱钓鱼16 小时前
Go语言实战案例- 开发一个ToDo命令行工具
后端·google·go
小wanga17 小时前
C++知识
java·开发语言·c++
学渣6765617 小时前
文件传输工具rsync|rust开发环境安装|Ascend实验相关命令
开发语言·后端·rust
我是渣哥17 小时前
Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
java·开发语言·jvm·后端·算法·职场和发展·性能优化
工一木子17 小时前
深入Java并发:锁机制原理剖析与性能优化实战
java·性能优化·并发·
你我约定有三17 小时前
java--写在 try 中的创建连接
java·开发语言