Spring中RestTemplate原始碼解析

2021-10-25 01:16:18 字數 1604 閱讀 9193

在實現客戶端的負載均衡中,有一種簡單的方式就是通過呼叫被@loadbalanced註解過的resttemplate來實現面向服務的介面呼叫。

例如:

@bean

@loadbalanced

resttemplate resttemplate()

這裡我沒有使用預設的new resttemplate(),我使用了自定義的配置

public class ******resttemplatebuilder 

public resttemplate build()

}

使用時直接

string resp = resttemplate.postforentity("http://wxgateway-service/internal/push_channel_configs", weixinconfigdtolist, string.class).getbody();
這是常見的resttemplate使用方式。接下來看一下resttemplate的原始碼。

public responseentitypostforentity(uri url, object request, classresponsetype) throws restclientexception
核心方法在於org.springframework.web.client.resttemplate#doexecute。

通過clienthttprequestfactory建立了乙個clienthttprequest。

clienthttprequest request = this.createrequest(url, method);
然後呼叫execute()方法返回了乙個clienthttpresponse

clienthttpresponse response = request.execute();
然後用之前建立resttemplate時新增的自定義的處理器處理返回結果

this.handleresponse(url, method, response);
最後使用資料提起器提取資訊轉換成返回型別資料。

//這個object的型別是responseentity,其中的body就是呼叫的時候填寫的返回值型別

object var14 = responseextractor.extractdata(response);

繼續跟進執行方法,找到

******bufferingclienthttprequest類上,最終呼叫的是httpurlconnection。
org.springframework.http.client.******bufferingclienthttprequest#executeinternal。

其餘的已經有前輩寫好了。我們可以參照一下別人的文章

參考:resttemplate原始碼解析(目錄)

Spring複習筆記 Spring中的Bean

注意構造器例項化 最常用 靜態工廠方式例項化 例項工廠方式例項化 singleton 單例 始終使用的同乙個物件 預設 prototype 原型 每次都是乙個新的bean例項 request session globalsession websocket init method屬性 用於指定bean...

Spring中 Transactional的使用

1.在需要事務管理的地方加 transactional註解,transactional 註解可以被應用於介面定義和介面方法 類定義和類的 public 方法上.2.transactional 註解只能應用到 public 可見度的方法上,如果你在 protected private 或者 packa...

Spring中 Transactional失效問題

spring中的宣告式註解 transactional很大程度的方便了開發者進行db資料儲存。但是在一些特殊情況下,可能會造成註解不是按想定的方式生效,這裡說幾種可能造成的幾種情況。這是一種比較簡單不過稍不注意也可能會犯的情況。spring中事務提交還是回滾是根據呼叫的方法是否丟擲異常來決定的,因此...