筆者在使用Golang的時候就發現構建系統依賴樹非常繁瑣,New了很多對象,又手工代碼將它們拼接起來,寫了一堆非常冗繁的代碼。然后就開始想,要是Golang像Java一樣有一個好用的依賴注入框架就好啦。
果不其然,Golang還真有,居然還是大廠facebook團隊開源的。
Golang的很多用戶都不是來自Java,依賴注入他們可能聽過,可是從來沒有玩過。為了說明依賴注入有多好用,我先用Java代碼來解釋一下。
先來看一下沒有依賴注入的Java世界是怎樣的
Golang的很多用戶都不是來自Java,依賴注入他們可能聽過,可是從來沒有玩過。為了說明依賴注入有多好用,我先用Java代碼來解釋一下。
先來看一下沒有依賴注入的Java世界是怎樣的
在main方法里面,我們new出來很多對象,然后用他們構造了一顆依賴樹。我們還寫了很多構造器,為了能方便的構造出每個節點。
這里我們使用的是另一個開源大廠google的依賴注入框架Guice。我們發現main方法縮減了很多代碼,所有的new操作都不見了,然后我們還發現每個對象的構造器也消失了,取而代之的是多了兩個注解@Singleton和@Inject,Singleton表示類是單例的,Inject表示當前字段使用依賴注入自動設置。好處不用多說,一目了然,就是幫我們節省代碼,省去了很多系統初始化時構建一系列對象的細節。另外Guice還需要定義一個Module,把依賴樹的葉子節點手工實例化一下,葉子結點對象往往不是簡單的依賴注入,而需要手動構造。如果把整個系統的狀態比喻成現實的物理世界,那么Module里面干的事就是宇宙大爆炸,所有一切對象的輸入源點。依賴注入僅僅幫我們省去了中間節點的構建工作。
在我們的例子中,這棵樹還談不上復雜,畢竟節點數很有限,節點之間的連接也很有限。在大型的復雜業務系統中,這樣的對象那就是成百上千了,如果沒有使用依賴注入的話,那就真是剪不斷理還亂了。
好,接下來我們說說facebookgo團隊開源的這個Inject框架如何使用。我們還使用上面的例子,用golang 改寫一下。
首先,我們看一下沒有依賴注入的Golang世界是怎樣的。
跟Java版本一樣,定義了不少構造器,然后手工組裝依賴樹。
然后我們把這段代碼改造成facebookgo依賴注入版本的
這個跟Java版本也很類似,只是Module的定義直接放在了main方法里,也就是上面代碼中的Provide方法調用,@Singleton不需要了,@Inject變成了`inject:""`。然后用Populate方法一次性將整個依賴樹構建出來就可以使用了。
看這個開源庫的源碼發現,整個類庫的實現才500多行代碼。這是多么輕量級的一個類庫,只不過代碼這么短,功能也不會太多,相比Java的依賴注入而言,它的功能就單一太多了。不過沒關系,相比Guice而言這些缺失的功能不是必須的,能幫我們省掉很多代碼它已經做得很好了,這就足夠了。要知道Java里面非常完善的依賴注入框架80%的代碼那都是為了實現那20%的特殊功能,基本功能所需要的代碼量是非常少的。
閱讀相關文章,關注微信公眾號/知乎專欄/頭條號【碼洞】