成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring WebFlux核心處理組件DispatcherHandler

開發 架構
DispatcherHandler從Spring配置中發現所需的委托組件。它本身也被設計為bean,并實現ApplicationContextAware以訪問它運行的上下文。

概述

?與Spring MVC類似,Spring WebFlux是圍繞前端控制器模式設計的,其中核心處理程序WebHandler 的實現DispatcherHandler為請求處理提供共享算法,而實際工作由可配置的委托組件執行。該模型非常靈活,支持多種工作流。

DispatcherHandler從Spring配置中發現所需的委托組件。它本身也被設計為bean,并實現ApplicationContextAware以訪問它運行的上下文。如果DispatcherHandler是用webHandler的bean名稱聲明的,那么WebHttpHandlerBuilder會發現它,它會將請求處理鏈組合在一起,如webHandler API中所述。

WebFlux應用程序中的Spring配置通常包含:

  1. bean名稱為webHandler的DispatcherHandler
  2. WebFilterWebExceptionHandler
  3. DispatcherHandler特殊bean
  4. 其它

配置被提供給WebHttpHandlerBuilder以構建處理鏈,如下例所示:

public class HttpHandlerAutoConfiguration {
@Configuration(proxyBeanMethods = false)
public static class AnnotationConfig {
@Bean
public HttpHandler httpHandler(ObjectProvider<WebFluxProperties> propsProvider){
// applicationContext方法中會收集容器中WebFilter和WebExceptionHandler
// build方法中構建了HttpWebHandlerAdapter(實現了HttpHandler),該對象中
// 包裝了WebFilter和WebExceptionHandler集合
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;
}
}
}

特殊一樣的Bean

?DispatcherHandler委托特殊bean處理請求并呈現適當的響應。所謂“特殊bean”,是指實現WebFlux框架規定的Spring管理的對象實例。一般都內置這些Bean,不過你可以自定義、擴展或替換它們的屬性。

  • HandlerMapping

將請求映射到處理程序。映射基于一些標準,這些標準的細節因HandlerMapping實現的不同而不同——注釋控制器、簡單URL模式映射等等。如:@RequestMapping注解的Controller或RouterFunction類型的Bean他們都是由不同的HandlerMapping來處理。

  • HandlerAdapter

幫助DispatcherHandler調用映射到請求的處理程序,而不管該處理程序實際是如何調用的。例如,調用帶注釋的控制器需要解析注釋。HandlerAdapter的主要目的是保護DispatcherHandler不受這些細節的影響。簡單說就是不同的HandlerAdapter處理由不同HandlerMapping返回的不同的Handler對象,比如:RequestMappingHandlerMapping返回的HandlerMethod,RouterFunctionMapping返回的HandlerFunction。

  • HandlerResultHandler?

處理處理程序調用的結果并完成響應。

WebFlux配置

應用程序可以聲明處理請求所需的基礎bean(列在Web Handler API和DispatcherHandler下面)。但是,在大多數情況下,WebFlux配置是最好的起點。它聲明所需的bean,并提供更高級別的配置回調API來自定義它。

請求處理

DispatcherHandler處理請求的方式如下:

  • 每個HandlerMapping被要求找到一個匹配的處理程序,并使用第一個匹配。
  • 如果找到處理程序,則通過適當的HandlerAdapter運行它,它將從執行中返回的值公開為HandlerResult
  • HandlerResult被提供給適當的HandlerResultHandler,以通過直接寫入響應或使用視圖進行渲染來完成處理。

結果處理

調用處理程序的返回值通過HandlerAdapter被包裝為HandlerResult,以及一些附加的上下文,并傳遞給聲稱支持它的第一個HandlerResultHandler。下表列出可用的HandlerResultHandler實現,所有這些實現都在WebFlux Config中聲明:

  • ResponseEntityResultHandler

返回值:ResponseEntity, 通常來自@Controller實例。

  • ServerResponseResultHandler

返回值:ServerResponse,通常來自功能端點。

  • ResponseBodyResultHandler

返回值:處理來自@ResponseBody方法或@RestController類的返回值。

  • ViewResolutionResultHandler?

返回值:CharSequence、視圖、模型、映射、渲染或任何其他對象都被視為模型屬性。

異常處理

從HandlerAdapter返回的HandlerResult可以基于某些特定于處理程序的機制公開用于錯誤處理的函數。在以下情況下調用此錯誤函數:

  • 處理程序(例如,@Controller)調用失敗。
  • 通過HandlerResultHandler處理處理程序返回值失敗。

只要錯誤信號發生在從處理程序返回的響應類型產生任何數據項之前,error函數就可以更改響應(例如,更改為錯誤狀態)。

這就是如何支持@Controller類中的@ExceptionHandler方法。相比之下,Spring MVC中的支持也是建立在HandlerExceptionResolver上的。注意:在WebFlux中,不能使用@ControllerAdvice來處理在選擇處理程序之前發生的異常。?

@RestControllerAdvice
public class PackControllerAdvice {

@ExceptionHandler
public ResponseEntity<String> handle(Exception ex){
ex.printStackTrace();
return ResponseEntity.ok(ex.getMessage() + ", Advice");
}

}

注意:這個不能處理調用處理程序之前的任何異常,處理程序之前的異常應該由WebExceptionHandler來處理

下面的異常處理句柄將會處理,由WebFilter實例鏈和目標WebHandle的異常。

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomWebExceptionHandler implements WebExceptionHandler {

@Override
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
System.out.println("異常了: " + ex.getMessage()) ;
// 將錯誤傳遞下去,后面的onErrorResume還可以繼續執行;如果傳遞,那么下一個處理器將會是DefaultErrorWebExceptionHandler
// return Mono.error(ex) ;
// exchange.getResponse()
// return Mono.error(ex) ;
// 下面不傳遞異常了,直接輸出錯誤信息
ServerHttpResponse response = exchange.getResponse() ;
response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR) ;
response.getHeaders().add("ContentType", "text/html;charset=utf8");
return response.writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap("ERROR".getBytes(Charset.forName("UTF-8"))))) ;
}

}
責任編輯:姜華 來源: 今日頭條
相關推薦

2023-02-09 08:01:12

核心組件非阻塞

2022-07-04 09:15:10

Spring請求處理流程

2023-09-04 11:52:53

SpringMVC性能

2020-05-21 13:25:43

Spring組件架構

2023-11-02 18:01:24

SpringMVC配置

2020-03-24 09:54:57

SpringMVCWebFlux

2019-03-04 08:48:23

Spring WebFJavaIO

2020-07-07 07:00:00

Spring WebFREST APIReactive AP

2021-07-15 11:16:31

Spring WebWebFlux架構

2024-03-06 07:52:21

Spring框架響應式編程微服務架構

2022-09-26 08:54:39

Spring函數式編程

2022-01-05 08:53:13

Spring原理分析MVC

2020-05-25 07:00:00

雙因素認證身份認證密碼

2024-01-10 09:59:19

虛擬線程信息

2019-08-06 09:21:45

2009-07-17 12:54:13

2011-04-22 10:13:35

SimpleFrame

2023-02-23 08:15:33

Spring異常處理機制

2023-01-13 08:11:24

2022-05-11 07:38:45

SpringWebFlux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线日韩在线 | 久久久久亚洲 | 亚洲一区av在线 | 国产精品1区 | 情侣酒店偷拍一区二区在线播放 | 国产精品18久久久 | 中文字幕在线播放第一页 | 国产一区二区影院 | 欧美一区二区三区一在线观看 | 久草视频在线播放 | 日韩精品一区二区三区中文字幕 | 国产一区二区在线免费播放 | 97日日碰人人模人人澡分享吧 | 中文字幕一区在线观看视频 | 久久久91精品国产一区二区精品 | 五月婷婷激情网 | 亚洲精品在线视频 | 国产一区二区在线视频 | 国产成人精品一区二区三区网站观看 | 久久精品91久久久久久再现 | 国产欧美日韩综合精品一 | 日韩高清成人 | 91久久久久| 网页av| 欧美特级黄色 | 成人欧美一区二区三区白人 | 精品亚洲一区二区三区 | 中文字幕精品一区二区三区在线 | 欧美一区二区 | av入口 | 欧美日韩久久久 | 91在线精品一区二区 | 亚洲成av片人久久久 | 成人三级视频在线观看 | 亚洲欧美日韩电影 | 91免费在线视频 | 亚洲一二三区不卡 | 欧美手机在线 | 天天宗合网 | 自拍视频网 | 高清成人免费视频 |