[肥朝]一比一手寫Dubbo源碼中的SPI,內附git地址

前言

以前對dubbo的SPI進行了四篇的分享.你們對這個概念有了一些初步的瞭解.談到編程水平如何進階,你們可能都會異口同聲的說出三個字,看源碼.可是我卻始終認爲,編程光,是永遠學不會的.可是不少時候,連怎麼看源碼都無從下手,你叫我寫仿寫源碼,這不是開玩笑?git

咱們能夠回憶一下咱們在公司是怎麼寫代碼的.首先產品提出需求,接着開需求評審會,再接着代碼設計,最後開始編碼.編程

今天咱們就仿造這個流程,本身動手實現dubbo的spi緩存

提出需求

Dubbo和JDK的SPI究竟有何區別? 中,咱們已經分析了dubbo中spi和jdk中spi有什麼區別,dubbo相比jdk變化的內容大體以下:框架

(一) 拓展點增長了緩存,提升了性能 (二) 增長了spi的默認值 (三) 增長了經過key的形式獲取拓展點 (四) 增長了IocAOP功能性能

這裏插句題外話,咱們不能爲了看源碼而看源碼,最重要的是,在看源碼的過程當中,學會分析問題的思路.假若有個新的RPC框架,好比肥朝RPC,我問你肥朝RPC中的SPI和JDK的SPI有幾點區別呢?我在Dubbo和JDK的SPI究竟有何區別?這篇中,就把我是如何分析出這四點的整個心路歷程展現出來,你能夠大膽走進個人心裏世界.編碼

需求評審

既然是需求評審,其實說白了,就是和產品砍需求.產品提出的需求就是上面那四個功能.(一)(二)(三)都是基本又比較核心的功能,這些砍了那這個版本就沒意思了,(四)這個能夠放在下一個版本去迭代開發.spa

代碼設計

只要實現了key-value獲取拓展點,那麼獲取默認拓展點就很容易了,由於這個默認拓展點只是key-value的一種特殊形式,他的默認值,也就是這個key,就在SPI註解上.其實思路總起起來就一句話,由於咱們在拓展點配置文件裏面已經配置了實現類的權限定名.首先咱們把這些配置文件所有加載出來,解析出全限定名,緩存起來.而後你要獲取具體的拓展點,我就在緩存中把他的權限定名拿出來,反射實例化成一個對象返回回去.也就是1.讀取並解析文件內容 2.放入map緩存 3.反射生成對象.這三個知識點,我相信看這篇文章的,沒有人不會.設計

按照上面的分析,把代碼寫出來不難吧.什麼,寫不出?那往下看3d

編碼

項目結構如圖:code

運行結果如圖

代碼已經上傳到碼雲.能夠下載跑起來,原本想用時序圖,流程圖和你們把思路理一下的,可是弄了幾個小時,我以爲還不如本身看代碼清楚.核心代碼代碼不到300行.有問題能夠留言.

地址: gitee.com/HelloToby/t…

小提示

由於以前部分同窗反饋對源碼中的思路還不是很清晰.因此此次我就直接把源碼中的功能模塊抽成一個demo,而後你們先把demo運行起來,接着把demo裏面的代碼重複寫個一兩遍.由於demo和源碼一比一高仿的(變量名,方法名甚至if換不換行都儘可能一致了).因此這個時候,再去看源碼就和看本身寫的代碼應該同樣的.這樣思路就清晰不少了.但願這個方式對你閱讀源碼有幫助.

寫在最後

肥朝 是一個專一於 原理、源碼、開發技巧的技術公衆號,號內原創專題式源碼解析、真實場景源碼原理實戰(重點)。掃描下面二維碼關注肥朝,讓本該造火箭的你,再也不擰螺絲!

相關文章
相關標籤/搜索