按照慣例,先引用一些大神的解釋
為什么使用依賴(lài)注入:
首先我們需要知道 吃挑,人們?cè)诤荛L(zhǎng)時(shí)間都是利用控制反轉(zhuǎn)原則規(guī)定:應(yīng)用程序的流程取決于在程序運(yùn)行的時(shí)候?qū)ο髨D的建立. 通過(guò)抽象定義的對(duì)象交互可以實(shí)現(xiàn)這樣的動(dòng)態(tài)流程.而使用依賴(lài)注入或者服務(wù)定位器便可以完成運(yùn)行時(shí)綁定.
使用依賴(lài)注入可以帶來(lái)哪些好處
- 依賴(lài)的注入和配置獨(dú)立于組件之外
- 因?yàn)閷?duì)象是在一個(gè)獨(dú)立不耦合的地方初始化,所以當(dāng)注入抽象方法的時(shí)候,我們只需要修改對(duì)象的實(shí)現(xiàn)方法,而不用大改代碼庫(kù).
- 依賴(lài)可以注入到一個(gè)組件中,我們可以注入這些依賴(lài)的模擬實(shí)現(xiàn),這樣使得測(cè)試更加簡(jiǎn)單.
上述為摘抄.............
發(fā)展歷程
Dagger1由Square公司創(chuàng)建的,Dagger2是Dagger1的分支,由Google公司接手開(kāi)發(fā).暫時(shí)知道這些就夠了,太原理的也看不懂.
Dagger2的部分注解的講解摘抄
- @Inject:通常在需要依賴(lài)的地方使用這個(gè)注解,換句話(huà)說(shuō),你用它告訴Dagger這個(gè)類(lèi)或者字段需要依賴(lài)注入.這樣Dagger就會(huì)構(gòu)造這個(gè)類(lèi)的實(shí)例并滿(mǎn)足他們的依賴(lài).
- @Module:Modules類(lèi)里面的方法專(zhuān)門(mén)提供依賴(lài),所以我們定義一個(gè)類(lèi),用@Module注解,這樣Dagger在構(gòu)造類(lèi)的實(shí)例的時(shí)候,就知道從哪里去找到需要的依賴(lài).Modules的一個(gè)重要特征是它們?cè)O(shè)計(jì)為分區(qū)并且組合在一起(比如說(shuō),在我們的app里面可以有多個(gè)組成在一起的modules).
- @Provide 在modules中,我們定義的方法是這個(gè)注解,以此來(lái)告訴Dagger我們想要構(gòu)造對(duì)象并且提供這些依賴(lài).
- @Component:Components從根本上來(lái)說(shuō)就是一個(gè)注入器,也可以說(shuō)是@Inject和@Module的橋梁,它的主要作用就是連接這兩個(gè)部分,Components可以提供所有定義了的類(lèi)型的實(shí)例.比如: 我們必須用@Component注解一個(gè)接口然后列出所有的@Modules組成該組件,如果缺失了任何一塊,都會(huì)在編譯的時(shí)候報(bào)錯(cuò),所有的組件都可以通過(guò)他的modules知道依賴(lài)的范圍.
- @Scope: Dagger2通過(guò)Scope可以利用自定義注解限定注解作用域.簡(jiǎn)單的來(lái)說(shuō)就是自定義注解定義這個(gè)注入對(duì)象的存活時(shí)間,例如@PerActivity @PerFragment @PerUser等等
- @Qualifier:當(dāng)類(lèi)的類(lèi)型不足以鑒別一個(gè)依賴(lài)的時(shí)候使用.例如:在Android中,我們會(huì)需要不同類(lèi)型的context,所以我們就可以定義qualifier注解@ForApplication或者@ForActivity,這樣當(dāng)注入一個(gè)context的時(shí)候,我們就可以告訴Dagger我們想要哪種類(lèi)型的context.
總結(jié):一些常用的注解類(lèi)型已經(jīng)摘抄完了,雖然我的項(xiàng)目里面一直都在用,但是這些東西我從來(lái)就沒(méi)有接觸過(guò)是為什么,項(xiàng)目的閑暇期我就決定自己做一些摘抄,里面會(huì)有通過(guò)我的學(xué)習(xí)我理解了哪些,理解不了哪些我都會(huì)分享出來(lái).好了,這一篇就暫且寫(xiě)到這里,沒(méi)有講一些實(shí)際的代碼,請(qǐng)?jiān)徫乙膊粫?huì),路漫漫其修遠(yuǎn)兮!!!最后請(qǐng)注意:我上述均為摘抄,著急的可以去百度搜Dagger2,第一個(gè)點(diǎn)進(jìn)去看!!!