SpringWebFlux執(zhí)行過程

Spring WebFlux的出現(xiàn)帶來了異步響應(yīng)式編程的福音,隨著它不斷的完善,使用者會(huì)逐漸的變多,作為經(jīng)常拿來與Spring MVC對比的框架。

它的執(zhí)行過程,設(shè)計(jì)上與Spring MVC有什么區(qū)別呢?

大致看了下其源碼,做了簡要梳理。

啟動(dòng)

1 仍然保持原有的方式啟動(dòng)應(yīng)用,那么Spring如何知道要啟動(dòng)WebFlux應(yīng)用呢?

  • WebApplicationType枚舉類中,deduceFromClasspath判斷如果存在DispatcherHandler,然后一些其它條件,那么系統(tǒng)認(rèn)為要啟動(dòng)的是Reactive的應(yīng)用
  • 否則,采用Servlet應(yīng)用
SpringApplication#run(java.lang.String...)
    context = createApplicationContext();
    switch (this.webApplicationType) {
                case SERVLET:
                    contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);
                    break;
                case REACTIVE:
                    contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
                    break;
                default:
                    contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
                }

2 在上下文刷新之后,啟動(dòng)Reactive服務(wù)。

image.png

運(yùn)行

1 首先肯定是從Netty的channelRead開始,不過我們從接近我們的鏈路開始分析。

reactor.netty.http.server.HttpServerHandle#onStateChange

->ReactorHttpHandlerAdapter.apply 封裝Request,Response。ReactorServerHttpRequest

-> HttpWebHandlerAdapter.handle 創(chuàng)建ServerWebExchange

-> ExceptionHandlingWebHandler.handle

-> FilteringWebHandler.handle

-> DefaultWebFilterChain.handle 使用WebFilter在請求處理前進(jìn)行filter

-> DispatcherHandler.handle 與Spring MVC對應(yīng),HandlerMapping,HandlerAdpater

-> handlerAdapter.handle

-> 調(diào)用我們的業(yè)務(wù)代碼

-> 后續(xù)定義結(jié)果封裝處理

最后

大流程上看起來不難理解,不過還是可以多看幾遍學(xué)習(xí)下其設(shè)計(jì)方式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容