源碼解析: Feign ParseHandlersByName

作用

在build方法中我們創(chuàng)建的第二個(gè)重要組件痢艺。
觀(guān)察它的apply方法可以猜到ParseHandlersByName的作用就是我們傳入Target(封裝了我們的模擬接口累奈,要訪(fǎng)問(wèn)的域名),返回這個(gè)接口下的各個(gè)方法,對(duì)應(yīng)的執(zhí)行HTTP請(qǐng)求需要的一系列信息。
結(jié)果Map<String, MethodHandler>的key是這個(gè)接口中的方法名字骡技,MethodHandler則是包含此方法執(zhí)行需要的各種信息。

    public Map<String, MethodHandler> apply(Target key) 

創(chuàng)建

private final Contract contract;
private final Options options;
private final Encoder encoder;
private final Decoder decoder;
private final ErrorDecoder errorDecoder;
private final SynchronousMethodHandler.Factory factory;

ParseHandlersByName的創(chuàng)建除了我們?cè)赽uild方法里面創(chuàng)建好的SynchronousMethodHandler.Factory(http://www.reibang.com/p/b11af0b51a72)以外羞反。還有其他幾個(gè)組件:

  1. Contract
    作用是將我們傳入的接口進(jìn)行解析驗(yàn)證布朦,看注解的使用是否符合規(guī)范,然后返回給我們接口上各種相應(yīng)的元數(shù)據(jù)昼窗。所以叫合約是趴。詳見(jiàn):http://www.reibang.com/p/6582f8319f72
  2. Options
    封裝Request請(qǐng)求的 連接超時(shí)=默認(rèn)10s ,讀取超時(shí)=默認(rèn)60s
  3. Encoder
    怎么把我們的請(qǐng)求編碼
  4. Decoder
    怎么把我們執(zhí)行HTTP請(qǐng)求后得到的結(jié)果解碼為我們定義的類(lèi)型
  5. ErrorDecoder
    怎么在我們執(zhí)行HTTP請(qǐng)求后得到的錯(cuò)誤(既不是2xx的狀態(tài)碼)解碼為我們定義的類(lèi)型

所以前面五種組件的作用加起來(lái)是在干嘛呢澄惊?準(zhǔn)備一個(gè)http請(qǐng)求執(zhí)行前的各種數(shù)據(jù)唆途,定義http執(zhí)行后對(duì)于結(jié)果的各種處理邏輯。
隨意這些組件的作用是 “處理每個(gè)HTTP執(zhí)行前后的事情”
接著加上我們傳入SynchronousMethodHandler.Factory的各種組件掸驱,還記得他們的作用么:“執(zhí)行HTTP請(qǐng)求”肛搬。
所以當(dāng)ParseHandlersByName這個(gè)組件創(chuàng)建好的時(shí)候,我們就已經(jīng)準(zhǔn)備好了執(zhí)行這個(gè)HTTP請(qǐng)求所需要的一切了亭敢。

所以build方法的前2個(gè)組件包含了 “執(zhí)行HTTP請(qǐng)求”和“處理每個(gè)HTTP執(zhí)行前后的事情”的能力滚婉。最后合并到了ParseHandlersByName中。

    public Feign build() {
      SynchronousMethodHandler.Factory synchronousMethodHandlerFactory =
          new SynchronousMethodHandler.Factory(client, retryer, requestInterceptors, logger,
                                               logLevel, decode404);
      ParseHandlersByName handlersByName =
          new ParseHandlersByName(contract, options, encoder, decoder,
                                  errorDecoder, synchronousMethodHandlerFactory);
      return new ReflectiveFeign(handlersByName, invocationHandlerFactory);
    }

使用

ParseHandlersByName最后把以上的組件都封裝為了一個(gè)結(jié)果集Map<String, MethodHandler>

public Map<String, MethodHandler> apply(Target key) {
      //如上文所提帅刀,contract抽取了接口上的元信息,封裝到了MethodMetadata里面远剩。
      //包含我們?cè)诮涌诜椒ㄉ嫌米⒔馓砑拥囊幌盗行畔⒖勰纭T斠?jiàn):http://www.reibang.com/p/6582f8319f72
      List<MethodMetadata> metadata = contract.parseAndValidatateMetadata(key.type());
      //new 結(jié)果容器
      Map<String, MethodHandler> result = new LinkedHashMap<String, MethodHandler>();
      //遍歷抽取出的MethodMetadata。
      for (MethodMetadata md : metadata) {
        BuildTemplateByResolvingArgs buildTemplate;
        //當(dāng)metadata里面有formParams并且bodyTemplate為空瓜晤,說(shuō)明請(qǐng)求的參數(shù)就是簡(jiǎn)單的Query參數(shù)锥余。
        if (!md.formParams().isEmpty() && md.template().bodyTemplate() == null) {
          buildTemplate = new BuildFormEncodedTemplateFromArgs(md, encoder);
        } else if (md.bodyIndex() != null) {
          buildTemplate = new BuildEncodedTemplateFromArgs(md, encoder);
        } else {
          buildTemplate = new BuildTemplateByResolvingArgs(md);
        }
        result.put(md.configKey(),
                   factory.create(key, md, buildTemplate, options, decoder, errorDecoder));
      }
      return result;
    }
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市痢掠,隨后出現(xiàn)的幾起案子驱犹,更是在濱河造成了極大的恐慌,老刑警劉巖足画,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雄驹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淹辞,警方通過(guò)查閱死者的電腦和手機(jī)医舆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蔬将,你說(shuō)我怎么就攤上這事爷速。” “怎么了霞怀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵惫东,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我毙石,道長(zhǎng)凿蒜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任胁黑,我火速辦了婚禮废封,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丧蘸。我一直安慰自己漂洋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布力喷。 她就那樣靜靜地躺著刽漂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弟孟。 梳的紋絲不亂的頭發(fā)上贝咙,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音拂募,去河邊找鬼庭猩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛陈症,可吹牛的內(nèi)容都是我干的蔼水。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼录肯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼趴腋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起论咏,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤优炬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后厅贪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蠢护,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年卦溢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糊余。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秀又。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贬芥,靈堂內(nèi)的尸體忽然破棺而出吐辙,到底是詐尸還是另有隱情,我是刑警寧澤蘸劈,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布昏苏,位于F島的核電站,受9級(jí)特大地震影響威沫,放射性物質(zhì)發(fā)生泄漏贤惯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一棒掠、第九天 我趴在偏房一處隱蔽的房頂上張望孵构。 院中可真熱鬧,春花似錦烟很、人聲如沸颈墅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恤筛。三九已至,卻和暖如春芹橡,著一層夾襖步出監(jiān)牢的瞬間毒坛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工林说, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煎殷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓述么,卻偏偏與公主長(zhǎng)得像蝌数,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子度秘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)饵撑,斷路器剑梳,智...
    卡卡羅2017閱讀 134,697評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,848評(píng)論 6 342
  • 數(shù)組對(duì)于每一門(mén)編程語(yǔ)言來(lái)說(shuō)都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語(yǔ)言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同滑潘。Java語(yǔ)言中提供的數(shù)...
    夢(mèng)之志閱讀 424評(píng)論 0 0
  • 第三次meetup屬于再次破冰吧垢乙! 先是每個(gè)人說(shuō)本周月了什么。再是每個(gè)人對(duì)方的缺點(diǎn)语卤。 nico主要看了一本書(shū)茶花女...
    文文的花期閱讀 251評(píng)論 0 1