Spring Webflux HttpHandler源码整理

HttpHandler的构造
  1. 自动启动配置类:HttpHandlerAutoConfiguration
    @Bean
    public HttpHandler httpHandler(ObjectProvider propsProvider) {
        HttpHandler httpHandler = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();
        WebFluxProperties properties = propsProvider.getIfAvailable();
        if (properties != null && StringUtils.hasText(properties.getBasePath())) {
            Map handlersMap = Collections.singletonMap(properties.getBasePath(), httpHandler);
            return new ContextPathCompositeHandler(handlersMap);
        }
       return httpHandler;
    }
    
  2. ApplicationContext.applicationContext
    获取spring容器中的WebHandler并保存到WebHttpHandlerBuilder中 (这里传入的WebHandler为DispatcherHandler实例)
    获取spring容器中的WebFilter并保存到WebHttpHandlerBuilder中
    获取spring容器中的WebExceptionHandler并保存到WebHttpHandlerBuilder中
    获取spring容器中的HttpHandlerDecoratorFactory并保存到WebHttpHandlerBuilder中
    获取spring容器中WebSessionManager并保存到WebHttpHandlerBuilder中
    ...
    
  3. WebHttpHandlerBuilder#build构建HttpHandler
    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
    public FilteringWebHandler(WebHandler handler, List filters) {
        this.delegate = handler;
        this.chain = new DefaultWebFilterChain(handler, filters);
    }
    
  5. 实例化DefaultWebFilterChain
    public DefaultWebFilterChain(WebHandler handler, List filters) {
         this.allFilters = Collections.unmodifiableList(filters);
         this.handler = handler;
         DefaultWebFilterChain chain = initChain(filters, handler);
         this.currentFilter = chain.currentFilter;
         this.chain = chain.chain;
     }
    
  6. initChain代码片段
     private static DefaultWebFilterChain initChain(List filters, WebHandler handler) {
         DefaultWebFilterChain chain = new DefaultWebFilterChain(filters, handler, null, null);
         ListIterator iterator = filters.listIterator(filters.size());
         while (iterator.hasPrevious()) {
             chain = new DefaultWebFilterChain(filters, handler, iterator.previous(), chain);
         }
         return chain;
     }
    
HttpHandler的执行
  1. HttpWebHandlerAdapter#handle执行
    public Mono 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)执行
    public Mono handle(ServerWebExchange exchange) {
         Mono 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
    public Mono handle(ServerWebExchange exchange) {
      return this.chain.filter(exchange);
    }
    
  4. DefaultWebFilterChain#filter执行
     public Mono filter(ServerWebExchange exchange) {
         return Mono.defer(() ->
              this.currentFilter != null && this.chain != null ?
                   invokeFilter(this.currentFilter, this.chain, exchange) :
                   this.handler.handle(exchange));
     }
     private Mono invokeFilter(WebFilter current, DefaultWebFilterChain chain, ServerWebExchange exchange) {
         String currentName = current.getClass().getName();
         return current.filter(exchange, chain).checkpoint(currentName + " [DefaultWebFilterChain]");
     }
    
  5. DispatcherHandler#handle执行

你可能感兴趣的:(spring,java,后端,webflux)