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
型別。
然後通過呼叫httpclientfinalizer
的responseconnection
方法,返回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...