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ù)。

運(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ì)方式。