1.什么是依賴注入
DI ,簡單的講广凸,講對象創(chuàng)建的過程交給容器阅茶,在需要的時候直接去拿,而不是代碼中創(chuàng)建谅海。是ioc的一種實現(xiàn)方式脸哀。
在 Java 領域中,我們就有 Spring扭吁、Guice 以及最近的 Dagger撞蜂。
參考這篇文章:依賴注入和控制反轉的理解白筹,寫的太好了
2.為什么使用這個技術
1.降低代碼之間的耦合,主要是一個類中創(chuàng)建另一個類谅摄,構成相互依賴的情況。
2.便于測試
3.Android 中的注入框架
3.1 Dragger2
3.1.1 介紹
Dagger 得名于樹狀結構的依賴系馆。能更準確地記住這是個依賴圖送漠,實際上是有向無環(huán)圖,或者說是 DAG由蘑,因此取名為 DAGger闽寡。
Google 的一個團隊還是決定做些改進,所以他們創(chuàng)造了 Dagger 2尼酿。
Dagger 2在編譯時完成了更多的工作爷狈,也很好地移除了反射,最后還能生成比最初版本Dagger 更容易調試的代碼裳擎。
它使得開發(fā)效率更高涎永,省去創(chuàng)建對象的過程,代碼充分解耦鹿响,同時可以更好的管理生命周期
_3.1.2 使用介紹
@Compone inject 和Module的橋梁羡微,是一個接口,定義了需要實例的類型惶我;
@inject Dragger2會構造它的實例以滿足依賴的需求;
@Module 將一個類進行module注解妈倔,編譯器就會在這個類進行查找需要的依賴實例。多個module相互分離绸贡,組合在一起使用盯蝴;
@Provide 在module內使用,告訴編譯器需要如何進行構造听怕;
@Scope 非常強大的功能捧挺,可以通過自定義注解來管理生命周期,比如使用--------@PerFragment @PerActivity @PerUser等尿瞭;
@Qualifier 當注入的參數(shù)不足以滿足依賴的時候使用松忍,比如context ,可以自定義qualifier annotation 比如 @ForActiivty,@ForApplication
@Inject Inject主要有兩個作用,一個是使用在構造函數(shù)上筷厘,通過標記構造函數(shù)讓Dagger2來使用(Dagger2通過Inject標記可以在需要這個類實 例的時候來找到這個構造函數(shù)并把相關實例new出來)從而提供依賴鸣峭,另一個作用就是標記在需要依賴的變量讓Dagger2為其提供依賴。
@Provide 用Provide來標注一個方法酥艳,該方法可以在需要提供依賴時被調用摊溶,從而把預先提供好的對象當做依賴給標注了@Injection的變量賦值。provide主要用于標注Module里的方法
@Module 用Module標注的類是專門用來提供依賴的充石。有的人可能有些疑惑莫换,看了上面的@Inject,需要在構造函數(shù)上標記才能提供依賴,那么如果我們需要提供 的類構造函數(shù)無法修改怎么辦拉岁,比如一些jar包里的類坷剧,我們無法修改源碼。這時候就需要使用Module了喊暖。Module可以給不能修改源碼的類提供依 賴惫企,當然,能用Inject標注的通過Module也可以提供依賴
@Component Component一般用來標注接口陵叽,被標注了Component的接口在編譯時會產(chǎn)生相應的類的實例來作為提供依賴方和需要依賴方之間的橋梁狞尔,把相關依賴注入到其中。
3.3.3 くぞ
① build.gradle
apply plugin: 'com.neenbedankt.android-apt'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
dependencies {
apt 'com.google.dagger:dagger-compiler:2.0'
compile 'com.google.dagger:dagger:2.0'
provided 'javax.annotation:jsr250-api:1.0'
...
}
②淺析Dagger2的使用
Dagger2 最清晰的使用教程
_1.@inject @component
_2.@provided @module
3.2 Butterknife
3.2.1 介紹
3.2.2 使用
Reference
Android中的依賴注入
Tasting Dagger 2 on Android
dragger2-git-sample
Android注解快速入門和實用解析