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