前言
之前對dubbo的SPI
進行了四篇的分享.大家對這個概念有了一些初步的瞭解.談到程式設計水平如何進階,大家可能都會異口同聲的說出三個字,看原始碼
.但是我卻始終認為,程式設計光看
,是永遠學不會的.關鍵還是要多動手,但是很多時候,連怎麼看原始碼都無從下手,你叫我寫仿寫原始碼,這不是開玩笑?
我們可以回憶一下我們在公司是怎麼寫程式碼的.首先產品提出需求,接著開需求評審會,再接著程式碼設計,最後開始編碼.
今天我們就仿造這個流程,自己動手實現dubbo的spi
提出需求
在 dubbo原始碼解析-spi(二) 中,我們已經分析了dubbo中spi和jdk中spi有什麼區別,dubbo相比jdk變化的內容大致如下:
(一) 擴充點增加了快取,提高了效能
(二) 增加了spi
的預設值
(三) 增加了通過key
的形式獲取擴充點
(四) 增加了Ioc
和AOP
功能
這裡插句題外話,我們不能為了看原始碼而看原始碼,最重要的是,在看原始碼的過程中,學會分析問題的思路.假如有個新的RPC框架,比如肥朝RPC,我問你肥朝RPC中的SPI和JDK的SPI有幾點區別呢?我在
dubbo原始碼解析-spi(二)
這篇中,就把我是如何分析出這四點的整個心路歷程展示出來,你可以大膽走進我的內心世界.
需求評審
既然是需求評審,其實說白了,就是和產品砍需求.產品提出的需求就是上面那四個功能.(一)(二)(三)都是基本又比較核心的功能,這些砍了那這個版本就沒意思了,(四)這個可以放在下一個版本去迭代開發.
程式碼設計
只要實現了key-value
獲取擴充點,那麼獲取預設擴充點就很容易了,因為這個預設擴充點只是key-value
的一種特殊形式,他的預設值,也就是這個key
,就在SPI
註解上.其實思路總起起來就一句話,因為我們在擴充點配置檔案裡面已經配置了實現類的許可權定名.首先我們把這些配置檔案全部載入出來,解析出全限定名,快取起來.然後你要獲取具體的擴充點,我就在快取中把他的許可權定名拿出來,反射例項化成一個物件返回回去.也就是1.讀取並解析檔案內容 2.放入map快取 3.反射生成物件.這三個知識點,我相信看這篇文章的,沒有人不會.
按照上面的分析,把程式碼寫出來不難吧.什麼,寫不出?那往下看
編碼
專案結構如圖:
執行結果如圖
程式碼已經上傳到碼雲.可以下載跑起來,本來想用時序圖,流程圖和大家把思路理一下的,但是弄了幾個小時,我覺得還不如自己看程式碼清楚.核心程式碼程式碼不到300行.有問題可以留言.
地址: https://gitee.com/HelloToby/tobySPI
點克隆/下載
按鈕,然後下載ZIP
,然後匯入eclipse
或者idea
就可以執行了.
小提示
因為之前部分同學反饋對原始碼中的思路還不是很清晰.所以這次我就直接把原始碼中的功能模組抽成一個demo,然後大家先把demo執行起來,接著把demo裡面的程式碼重複寫個一兩遍.因為demo和原始碼一比一高仿的(變數名,方法名甚至if換不換行都儘量一致了).所以這個時候,再去看原始碼就和看自己寫的程式碼應該一樣的.這樣思路就清晰很多了.希望這個方式對你閱讀原始碼有幫助.
寫在最後
這個是停更兩個月後,迴歸的第一篇文章.由於公司的某些原因,接下來可能無法像去年一樣,每週一更.但是儘量保證,兩週一更.但是即使兩週一更,也會每週不斷學習提升自己,給大家帶來更好的分享.但是鑑於肥朝才疏學淺,文中不足之處還望你不吝斧正.也歡迎關注我的掘金,名稱為肥朝.