控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。其中最多見的方式叫作依賴注入(Dependency Injection,簡稱DI),還有一種方式叫「依賴查找」(Dependency Lookup)。經過控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體,將其所依賴的對象的引用傳遞給它。也能夠說,依賴被注入到對象中。前端
以上這段是引用自維基百科的解釋。在採用面向對象方法設計的系統中,全部的對象經過彼此間的合做,最終實現業務邏輯。所謂的控制反轉,便是將咱們代碼裏面須要實現的依賴對象建立及銷燬工做交給一個容器來實現。Spring 框架的 IOC 是比較知名,也是應用較普遍的一個實現。以前花了段時間研究了下它的代碼,而後爲了好玩兒,本身造了一個簡單輪子。git
可能會有人問,你爲何又重複造輪子呢,已經有 Spring 框架能夠用啦。我倒不認爲重複造輪子是很差的,知道怎麼造輪子,而且把輪子造出來對解決開發中碰見的問題是很是有幫助的。由於你知道它怎麼實現的,天然就知道去哪裏找解決問題的辦法。我認爲學習一個技術,不單單止步於用得熟練,更應該深究其原理和實現,從中獲得啓發就更好了。先透露下,我後面會再分享另一個輪子叫 sunflower-mvc,很輕量級的一個框架,也會加入一些最佳實踐,很是適合寫 API應用。下面就進入今天的主題:github
今天咱們要使用的方法即是依賴注入中的基於註解和set函數的方式。大體分爲如下幾個步驟:編程
首先,咱們定義兩個註解@Bean
和@Resource
,前者用於標註一個對象須要容器管理,後者用於標註所依賴的對象。註解@Bean
的值不容許爲空,@Resource
的值能夠爲空(則使用字段名稱)。至於關於註解的語法,請自行查詢相關資料。 後端
而後就是掃描指定包下的類,這段代碼比較長,從 Spring 源碼中直接拿過來複用的。總結來講,經過遞歸掃描指定包路徑下的文件把你要進行依賴注入的全部Class加入一個Set集合中,後面會遍歷這個集合並分析每一個類的依賴關係。mvc
接下來是分析註解和依賴並建立對象,注入依賴。框架
遍歷類集合,若是檢測到有@Bean
註解則實例化對象存放到Map中,而後繼續掃描該類下的全部field,若是發現@Resource
註解則記錄依賴值Map中。 而後遍歷依賴關係Map,進行依賴注入。
函數
再提供一個函數用於從工廠中獲取Bean對象。 單元測試
在com.mlongbo.sunflower.ioc.bean包中定義兩個Bean: 最後再寫個例子單元測試下:
學習
至此,大功告成~ 若是有錯誤和須要完善的地方還請指正,也歡迎你到Github參與討論。完整代碼請查看 GitHub倉庫。
點擊 {連接},訪問項目主頁。
掃描二維碼,關注我。
內容大多會是後端技術、前端工程、DevOps,偶爾會有一些大數據相關,會推薦一些好玩的東西。但願你會喜歡~
一切,源於喜歡。