摘要:通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用傳遞給它。依賴注入接下來是分析注解和依賴并創建對象,注入依賴。
前言控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。
以上這段是引用自維基百科的解釋。在采用面向對象方法設計的系統中,所有的對象通過彼此間的合作,最終實現業務邏輯。所謂的控制反轉,即是將我們代碼里面需要實現的依賴對象創建及銷毀工作交給一個容器來實現。Spring 框架的 IOC 是比較知名,也是應用較廣泛的一個實現。之前花了段時間研究了下它的代碼,然后為了好玩兒,自己造了一個簡單輪子。
可能會有人問,你為什么又重復造輪子呢,已經有 Spring 框架可以用啦。我倒不認為重復造輪子是不好的,知道怎么造輪子,并且把輪子造出來對解決開發中遇見的問題是非常有幫助的。因為你知道它怎么實現的,自然就知道去哪里找解決問題的辦法。我認為學習一個技術,不僅僅止步于用得熟練,更應該深究其原理和實現,從中得到啟發就更好了。先透露下,我后面會再分享另外一個輪子叫 sunflower-mvc,很輕量級的一個框架,也會加入一些最佳實踐,非常適合寫 API應用。下面就進入今天的主題:
實現今天我們要使用的方法便是依賴注入中的基于注解和set函數的方式。大致分為以下幾個步驟:
定義注解類;
掃描指定包路徑下的類;
分析注解和依賴關系并創建對象,注入依賴;
BeanFactory 開放獲取類實例的函數;
定義注解類首先,我們定義兩個注解@Bean和@Resource,前者用于標注一個對象需要容器管理,后者用于標注所依賴的對象。注解@Bean的值不允許為空,@Resource的值可以為空(則使用字段名稱)。至于關于注解的語法,請自行查詢相關資料。
然后就是掃描指定包下的類,這段代碼比較長,從 Spring 源碼中直接拿過來復用的。總結來說,通過遞歸掃描指定包路徑下的文件把你要進行依賴注入的所有Class加入一個Set集合中,后面會遍歷這個集合并分析每個類的依賴關系。
依賴注入接下來是分析注解和依賴并創建對象,注入依賴。
遍歷類集合,如果檢測到有@Bean注解則實例化對象存放到Map中,然后繼續掃描該類下的所有field,如果發現@Resource注解則記錄依賴值Map中。
然后遍歷依賴關系Map,進行依賴注入。
再提供一個函數用于從工廠中獲取Bean對象。
在com.mlongbo.sunflower.ioc.bean包中定義兩個Bean:
最后再寫個例子單元測試下:
至此,大功告成~ 如果有錯誤和需要完善的地方還請指正,也歡迎你到Github參與討論。完整代碼請查看 GitHub倉庫。
點擊 {鏈接},訪問項目主頁。
掃描二維碼,關注我。
內容大多會是后端技術、前端工程、DevOps,偶爾會有一些大數據相關,會推薦一些好玩的東西。希望你會喜歡~
一切,源于喜歡。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65826.html
摘要:除了,還簡單介紹了對的支持,可以幫助應用將散落在各處的邏輯匯集于一處切面。當裝配的時候,這些切面能夠運行期編織起來,這樣就能呢個非常有效的賦予新功能。 第1章 Spring之旅 說明 1、本文參考了《Spring 實戰》重點內容,參考了GitHub上的代碼 2、每個人的學習方式不一樣,但目的是一樣的,活學活用。最近一直在聽《我們不一樣》 3、本文只為記錄作為以后參考,要想真正領悟Sp...
摘要:之旅簡化開發的使命簡化開發為了降低開發的復雜性,采取如下關鍵策略基于的輕量級和最小侵入性編程通過依賴注入和面向接口實現松耦合基于切面和慣例進行聲明式編程通過切面和模版減少樣式代碼依賴注入耦合性具有兩面性一方面,緊密耦合的代碼難以測試難以復 Spring之旅 簡化Java開發 Spring的使命:簡化Java開發 為了降低Java開發的復雜性,采取如下關鍵策略:基于POJO的輕量級和最...
摘要:表示少女與緊耦合在它的構造函數中自行創建了。面向切面編程往往被定義為促使軟件系統實現關注點的分離一項技術系統由許多不同的組件組成,每個組件各負責一特定的功能。我們可以把切面想象為覆蓋在很多組件之上的一個外殼。 第1章 Spring之旅 說明 1、本文抄寫了《Spring 實戰》重點內容,參考了GitHub上的代碼 2、每個人的學習方式不一樣,但目的是一樣的,活學活用。最近一直在聽《我...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續后端好書閱讀與推薦續二幾個月又過去了,又讀了幾本書,同時為了深切體會到某些書里面的要點還專門做了一個小項目,這里就把讀書與小項目過程中的一些心得體會記錄一下。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續)后端好書閱讀與推薦(續二) 幾個月又過去了,又讀了幾本書,同時為了深切體會到某些書里面的要點還...
閱讀 1002·2021-09-30 09:58
閱讀 2829·2021-09-09 11:55
閱讀 2001·2021-09-01 11:41
閱讀 991·2019-08-30 15:55
閱讀 3350·2019-08-30 12:50
閱讀 3495·2019-08-29 18:37
閱讀 3295·2019-08-29 16:37
閱讀 2011·2019-08-29 13:00