當前位置:編程學習大全網 - 源碼下載 - SpringCloud系列之Feign-5.@EnableFeignClients底層機制深度解析

SpringCloud系列之Feign-5.@EnableFeignClients底層機制深度解析

@EnableFeignClients 源碼比較值得壹讀,讀完之後我們就學會了如何自己寫壹個註解並成功運用起來了

1.首先我們進入到 @EnableFeignClients註解裏面可以看到這個註解裏面聲明了幾個屬性,通過名稱大概可以看到比如basePackages應該是包路徑,value的話應該是個basePackages別名,我們暫且不管,看下這個註解上面有個@Import的註解,點進去這個類來看壹下

2.如圖可以看到FeignClientsRegistrar這個類實現了三個Spring的類,根據名稱大概猜壹下,第壹個應該是關於類定義註冊的類,第二個第三個相信大家可能用過或者了解過就是Spring的Aware的壹些類,大致就是加載資源或者環境變量的類

那我們看壹下ImportBeanDefinitionRegistrar類裏面是什麽:

可以看到裏面定義了壹個方法,那麽我們重新返回到FeignClientsRegistrar看下他是怎麽實現這個方法的:

這個方法主要幹了兩件事兒,第壹個方法是註冊了默認的配置信息,第二個就是註冊FeignClients,我們挨個壹個個詳細的看下:

到了較為詳細的源碼時候,如果看不懂,我們最好是打斷點,當我們啟動了Eureka-server,Eureka-client,然後再啟動Feign-consumer的時候,斷點就可以進來,我們可以看到壹些傳參的信息:

可以看到這個metedata裏面的數據剛好就是在啟動類上面的三個註解,並且還帶有三個註解的屬性信息,下面再給大家看下主類對照下就懂了:

然後我們繼續往下面學習:

這壹步就比較好理解了,我們拿到EnableFeignClients這個註解的屬性信息。

然後就是拼接了壹個名稱,這個名稱就是啟動類的前端加了個default.而已,然後registry沒變還是傳參過來,defaultAttrs.get("defaultConfiguration")這個屬性從剛剛斷點來看也是空的。調用了壹個registerClientConfiguration方法:

這個方法就是使用了Spring的BeanDefinitionBuilder把FeignClientSpecification這個bean給註冊到Spring容器中了。

然後我們繼續放回到主方法中看下壹個方法:

這個方法根據名稱registerFeignClients來說應該就是註冊FeignClients類了,進入方法中,第壹個scanner我們看下:

有點看不懂,沒關系,猜壹下,可能是掃描類的工具把。

我們繼續王下面走,scanner加載了壹個resourceLoader這個類,這個類我們可以查壹下,他是Spring框架中與資源相關的類,然後再往下看

下面還是獲取主類中的註解EnableFeignClients的屬性信息

再往下,我們可以從圖中看到在屬性中獲取關於clients的信息,但是沒有,然後scanner就加了壹個類似過濾器的東東,然後調用了getBasePackages的方法

下面我們看下getBasePackages方法:

看過之前的方法,這個方法就好理解了,首先就還是獲取EnableFeignClients的所有屬性信息,然後把值都給取出來,取得屬性分別是value還是basePackages等關於包路徑的屬性值,如果都沒有獲取到,就獲取壹個默認的包路徑

這個包路徑斷點可以看到就是主類的包路徑,所以整體上看,這些邏輯就是首先看註解中有沒有關於FeignClient的包路徑信息,如果沒有配置,那程序就準備從主程序所在的包路徑下找所有的FeignClient了。

我們再詳細看下:

然後繼續看這個registerClientConfiguration方法:

這個方法我們之前看過就是把某個類加載到Spring中所以繼續下壹步,看registerFeignClient方法:

獲取到這個FeignClient的所有屬性之後,我們就進行數據處理,把屬性信息都賦值給definition

這個方法表示我們把這個類以 按照類型註入 作為屬性,然後

這塊邏輯就是為了防止兩個有同壹個父類的FeignClient出現問題所做的,我們應該都遇到過壹個問題就是 使用 @Autowire註入類的時候發現報錯,說是有兩個類不知道註入哪壹個,而如果其中壹個有@primary註解的話,spring是會優先註入這個類的。

下面就沒什麽了,直到最後執行了

整個@EnableFeignClients的實現到此執行完畢,這個註解的源碼相對來說看起來算是比較清晰明了了,而且對於我們如果有做壹個新註解的需求的話,完全可以參照著做,非常具有模板意義。

  • 上一篇:DNF手遊賭馬活動穩賺攻略指引
  • 下一篇:助聽器的工作原理,主要性能指標,普及情況的原因
  • copyright 2024編程學習大全網