Spring5 WebClient原始碼簡析

2021-10-06 06:00:32 字數 4429 閱讀 9964

webclient是spring5引入的響應式非阻塞http客戶端,同時支援阻塞式呼叫。其中exchange()方法是非阻塞式的, 而retrieve()方法是阻塞式的。webclient內部將實際發出請求的操作委託給乙個http客戶端庫,預設是reactor netty。

下面首先寫乙個**示例:

system.out.println("rp = " + rp);首先分析第一步建立webclient客戶端:

static webclient create()
跟蹤進去可以發現他建立的型別是defaultwebclient型別。

然後是get呼叫:

@override

public requestheadersurispec<?> get()

private requestbodyurispec methodinternal(httpmethod httpmethod)
返回乙個request的定義,可以指定request header, uri, body, cookie等。

然後是uri方法:

@override

public requestbodyspec uri(string uritemplate, object... urivariables)

通過uribuilde***ctory來替換url中的佔位符。

exchange方法:

@override

public monoexchange()

首先建立乙個request物件:

public clientrequest build()新增header, cookie以及attributes到request物件中,然後返回bodyinserterrequest型別的request物件。

然後看exchange方法返回的型別:

.switchifempty(no_http_client_response_error));其實它通過mono.defer返回了乙個延遲呼叫的mono物件, 然後具體在這裡clientresponse clientresponse = response.block();會呼叫exchangefunction.exchange(request)

exchangefunction根據文件, 根據clientrequest物件,獲得延遲的clientresponse物件,即執行實際的發出請求獲取結果的操作。

exchangefunction的預設型別是defaultexchangefunction,這裡看下它的exchange()方法:

@override

public monoexchange(clientrequest clientrequest) );

}

因為webclient預設使用reactor netty庫, 所以這裡的connector型別預設是reactorclienthttpconnector

connector的最基礎的介面型別是clienthttpconnector, 根據文件是http客戶端的抽象,提供了必要的屬性,方法這些,傳送請求(clienthttprequest), 返回結果(clienthttpresponse)。它和exchangefunction的關係時,exchangefunction持有clienthttpconnector屬性。

上面乙個方法實際的操作在connect方法裡, 下面的都是做一些log及轉換,下面進入connect方法:

}如果不是絕對路徑,丟擲異常。

如果是絕對路徑,繼續往下,httpclient是httpclient型別,預設實現類是httpclientheaders,經過request, uri和send方法分別填充請求型別, url, 以及tcpclient的body屬性後,返回的是httpclientfinalizer型別。

然後通過呼叫httpclientfinalizerresponseconnection方法,返回flux然後tcpclient返回乙個monohttpconnect物件, 它繼承自mono,因此,只有在block()獲取物件的時候才會真正執行。

}當然這些都是reactor netty中的內容,有興趣的可以看看這個庫。

spring學習筆記5

場景 想通過magicboss.getcar方法每次都得到乙個新的car例項。car是prototype,但magicboss是singleton。可以採用lookup方法注入。依賴於cglib。cglib可以在執行期動態操作位元組碼,為bean動態建立子類或實現類。public inte ce m...

Spring學習筆記 (5)

spring 1.需要注入的屬性寫到配置檔案中 如果屬性為基礎型別,需要有setter 方法,必須也寫在包的類 中,因為需要setter 方法 如果屬性為類,需要有無參構造方法,可不寫在包的類 中 2.spring config.xml的告知 在程式入口告知 對於測試入口 contextconfig...

Spring5原始碼分析之Spring

因為本人打算仿照spring寫個小型spring tinyspring,所以要閱讀spring原始碼,在閱讀原始碼過程中的發現就記錄於此,如果有什麼錯誤,歡迎指出,我會及時更正。dispatcherservlet繼承了httpservlet並把doget,dopost等一系列方法在內部都呼叫dopr...