一、首先你要知道什麼是依賴?
想要理解Dagger2,首先你要理解一個概念,就是什麼是依賴,懂的同學可以省過此段。這裏給大家舉個通俗易懂的例子,讓你秒懂什麼是依賴,你今天去辦港澳通行證,出入境告訴你想辦理這個證你要攜帶你的個人身份證和戶口本,不然不給你辦,這個時候就產生了一個依賴關係,通行證的辦理需要依賴身份證和戶口本,我們就想到用代碼實現可以如下。
class PassPort{
private IDCardBean mIDCard;
private FamilyRegisterBean mFamilyRegister;
public PassPort(){
this.mIDCard = new IDCardBean();
this.mFamilyRegister = new FamilyRegisterBean();
}
}
或者
class PassPort{
private IDCardBean mIDCard;
private FamilyRegisterBean mFamilyRegister;
public PassPort(IDCardBean mIDCard, FamilyRegisterBean mFamilyRegister){
this.mIDCard = mIDCard;
this.mFamilyRegister = mFamilyRegister;
}
}
IDCardBean mCard = new IDCardBean();
FamilyRegisterBean mFR = new FamilyRegisterBean();
PassPort mPassPort = new PassPort(mCard, mFR);
}
上面兩段代碼咋一看沒啥毛病,但是如果現在我告訴你,你去辦理身份證也同時需要帶戶口本還有身份證照片回執等,辦理戶口本還需要各種證明等,那麼這個時候 IDCardBean 和 FamilyRegisterBean 的構造函數是不是也要相應地做出改變,而通行證 PassPort 的代碼是不是也要做出修改,這時就有人說了,沒事啊我可以改,那麼如果你項目中有一百個地方都用到了呢,你是不是都要逐個逐個去改呢?爲了不需要改動太多地方,我們必須給通行證和身份證、戶口本進行降耦。
二、知道依賴的概念後,你要知道Dagger2是個什麼東西
從上面的例子可以看出,如果按照我們日常的編碼習慣,如果存在依賴關係的某一處有一些小修改,都可能會給代碼量大的項目造成很大的改動,這樣是不符合工程思想的,所以就出現了各種依賴注入框架,Dagger2就是其中的一個,它的前身是Dagger1,Dagger1是由Square公司開發的,而Dagger2卻是由谷歌公司接手開發,兩者還是存在一些區別的,不過這篇文章不會做太多介紹,主要還是教會大家如何使用Dagger2。
三、初步瞭解Dagger2後,你需要知道幾個重要的概念
在正式使用Dagger2之前,你需要了解以下幾個重要的註解,爲了方便大家的理解,我會用最通俗的話來解釋,如果想知道更多的可以查看官方文檔。
1、@Inject:目標類用這個註解修飾的一些方法或者屬性(字段),說明這個目標類需要這個依賴,比如上面例子中就可以在身份證字段和戶口本字段上加上這個註解
2、@Module:用這個註解修飾的類說明是一個提供依賴的類,比如我們可以把通行證的依賴身份證和戶口本一起放在用這個註解修飾的類中
3、@Provide:這個註解主要用來修飾 @Module 修飾的類中的方法
4、@Component:這個是把 @Inject 和 @Module 關聯在一起的橋樑
5、@Scope:作用域
四、你需要知道Dagger2的使用步驟
1、定義所需要的bean,比如前面的 PassPort 、IDCardBean 之類的,然後在需要注入依賴的地方標上 @Inject 註解。
2、定義一個類,命名爲 XXXModule ,比如 PassPortModule,用 @Module 註解這個類。
3、在PassPortModule 這個類中定義你需要提供依賴的方法,這些方法名一般爲 provideXXX,而且要用 @Provides 來註解,方法體就是 new 一個依賴實例,比如 new 一個 IDCardBean 實例。
4、創建一個接口,一般命名爲 XXXComponent,接口要用 @Component 註解,並需要傳入相應的 module 參數,例如 @Component(modules = PassPortModule.class),另外需要提供一個注入方法,一般寫成 void inject(目標類 tmp),比如 void inject(PassPort passPort)
五、開始上代碼
1、在根項目(project)的 build.gradle 中添加以下代碼,爲了添加 apt 插件
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
2、在 app (module)的 build.gradle 中添加以下代碼
dependencies {
apt 'com.google.dagger:dagger-compiler:2.6'
compile 'com.google.dagger:dagger:2.6'
}
注意上面兩個步驟的版本可能會有所不一樣。
3、定義PassPortActivity,並在需要依賴的屬性上用 @Inject 註解
public class PassPortActivity extends BaseActivity{
@Inject
IDCardBean mIDCard;
@Inject
FamilyRegisterBean mFamilyRegister;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewId());
}
}
4、定義PassPortModule,並用 @Module 註解這個類,類裏面寫上提供依賴的方法,方法用@Provides註解,方法體則是 new 出依賴實例
@Module
public class PassPortModule {
private final PassPortActivity mView;
public PassPortModule(PassPortActivity view) {
this.mView = view;
}
@PerActivity
@Provides
public IDCardBean provideIDCard() {
return new IDCardBean(mView);
}
@PerActivity
@Provides
public FamilyRegisterBean provideFamilyRegister() {
return new FamilyRegisterBean(mView);
}
}
5、定義PassPortComponent
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = PassPortModule.class)
public interface PassPortComponent {
void inject(PassPortActivity activity);
}
6、這個時候依賴關係就已經建立好了,你需要重新編譯一下你的工程,Android studio 的快捷鍵是 ctrl+f9
7、在你 onCreate 方法裏面添加以下代碼
DaggerPassPortComponent.builder()
.applicationComponent(getAppComponent())
.passPortModule(new PassPortModule(this))
.build()
.inject(this);
到現在,你已經會Dagger2的基本使用了,這裏說明一下,如果你沒進行第6個步驟,或者這個步驟中編譯出錯,那麼你是無法進行到第七步的,因爲這篇文章只講解Dagger2的基礎使用,有興趣深入瞭解的可以期待下我的另一篇文章
Dagger2實現依賴注入之深入探究,我會帶着大家看下Dagger2生成的代碼中是如何工作的。