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

Spring WebFlux核心處理組件DispatcherHandler

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

概述

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

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

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

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

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

public class HttpHandlerAutoConfiguration {
@Configuration(proxyBeanMethods = false)
public static class AnnotationConfig {
@Bean
public HttpHandler httpHandler(ObjectProvider<WebFluxProperties> propsProvider){
// applicationContext方法中會收集容器中WebFilter和WebExceptionHandler
// build方法中構(gòu)建了HttpWebHandlerAdapter(實現(xiàn)了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處理請求并呈現(xiàn)適當?shù)捻憫K^“特殊bean”,是指實現(xiàn)WebFlux框架規(guī)定的Spring管理的對象實例。一般都內(nèi)置這些Bean,不過你可以自定義、擴展或替換它們的屬性。

  • HandlerMapping

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

  • HandlerAdapter

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

  • HandlerResultHandler?

處理處理程序調(diào)用的結(jié)果并完成響應。

WebFlux配置

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

請求處理

DispatcherHandler處理請求的方式如下:

  • 每個HandlerMapping被要求找到一個匹配的處理程序,并使用第一個匹配。
  • 如果找到處理程序,則通過適當?shù)?span style="color: #f04142;">HandlerAdapter運行它,它將從執(zhí)行中返回的值公開為HandlerResult
  • HandlerResult被提供給適當?shù)?span style="color: #f04142;">HandlerResultHandler,以通過直接寫入響應或使用視圖進行渲染來完成處理。

結(jié)果處理

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

  • ResponseEntityResultHandler

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

  • ServerResponseResultHandler

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

  • ResponseBodyResultHandler

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

  • ViewResolutionResultHandler?

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

異常處理

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

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

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

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

@RestControllerAdvice
public class PackControllerAdvice {

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

}

注意:這個不能處理調(diào)用處理程序之前的任何異常,處理程序之前的異常應該由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還可以繼續(xù)執(zhí)行;如果傳遞,那么下一個處理器將會是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"))))) ;
}

}
責任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2023-02-09 08:01:12

核心組件非阻塞

2022-07-04 09:15:10

Spring請求處理流程

2020-05-21 13:25:43

Spring組件架構(gòu)

2023-09-04 11:52:53

SpringMVC性能

2023-11-02 18:01:24

SpringMVC配置

2022-01-05 08:53:13

Spring原理分析MVC

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架構(gòu)

2022-09-26 08:54:39

Spring函數(shù)式編程

2024-03-06 07:52:21

Spring框架響應式編程微服務架構(gòu)

2024-01-10 09:59:19

虛擬線程信息

2020-05-25 07:00:00

雙因素認證身份認證密碼

2009-07-17 12:54:13

2019-08-06 09:21:45

2021-02-19 08:38:36

Kubernetes容器化分布式

2022-09-30 10:44:47

Netty組件數(shù)據(jù)

2011-04-22 10:13:35

SimpleFrame

2023-02-23 08:15:33

Spring異常處理機制
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 色综合av | 亚洲美女在线一区 | 超碰在线97国产 | 精区3d动漫一品二品精区 | 国产精品久久久久久福利一牛影视 | 99视频在线播放 | 日本久久福利 | 天天躁日日躁狠狠的躁天龙影院 | 亚洲欧洲成人av每日更新 | 日韩在线免费视频 | 色999视频| 2020亚洲天堂 | 免费性视频 | 伊人春色在线观看 | 国产亚洲精品区 | 日韩午夜| 国产在线高清 | 亚洲精品一区二区网址 | 中文字幕乱码一区二区三区 | 999国产精品视频 | 在线欧美日韩 | 韩日精品视频 | 国产一在线观看 | 久久精品国产99国产精品 | 国产一区二区三区久久久久久久久 | 亚洲午夜一区二区 | 亚洲精品久久久蜜桃网站 | 中文字幕精品一区二区三区精品 | 欧美日本一区二区 | 日日摸日日碰夜夜爽2015电影 | 天堂精品视频 | 国产激情在线 | 国产精品久久 | yiren22 亚洲综合 | 久久久国产精品视频 | 中文在线a在线 | 国产精品视频一区二区三 | 日本一二区视频 | 亚洲精品欧美 | 在线成人av | 日韩高清国产一区在线 |