Dagger2是一款使用在Java和Android上的依賴注入的一個類庫,目前Dagger有兩個分支,一個由Square維護,一個爲Google在前者的基礎上開出的分支,即Dagger2
一般情況下,我們創建一個對象的時候都是採用new的形式,這樣就會導致在代碼多起來的時候,你不知道對象在哪裏被創建,Dagger2就是爲了方便管理這些對象。
1
Dagger2環境的搭建:
Dagger2的環境搭建很簡單,在studio的工程的build.gradle下添加:
buildscript {
......
dependencies {
......
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
在module的build.gradle添加:
apply plugin: 'com.neenbedankt.android-apt'
......
dependencies {
......
compile 'com.google.dagger:dagger:2.5'
apt "com.google.dagger:dagger-compiler:2.5"
provided 'javax.annotation:javax.annotation-api:1.2'
}
這樣,Dagger2的環境就搭建好了,下面我們來實現Dagger2的使用。
2 Dagger2的使用:
@Inject註解
該註解用來標記需要自動創建實例的類,哪個類需要初始化,就在哪個類的構造方法前面加上這個註解,然後再到該類的對象的前面也加上這個註解,在這裏,我們創建一個Dagger_data1的類。該類有一成員變量int a=10;重寫該類的構造方法,並在其上面添加@Inject,
@Inject public Dagger_data1(){ }在MainActivity中聲明Dagger_data1的對象,
@Inject Dagger_data1 data1;
此時編譯的話,是無法正常運行的,@Inject並不能真正的創建對象,因此,我們還需要一個連接器去把
MainActivity中的對象和Dagger_data1連接起來,那就是@Component
@Component:剛說了Component是一個連接器,他通過查找目標類中用Inject註解標註的對象(本例子的對象在MainActivity中),查找到相應的對象後,接着查找該對象所在的類對應的用Inject標註的構造函數(這時候就發生聯繫了),剩下的工作就是初始化該變量的實例並把實例進行賦值。
public void inject(MainActivity activity);
注意,該方法傳進來的參數一定要和對象所在的上下文環境對應,本例子的對象是在MainActivity,參數就是
MainActivity,寫到這裏,連接器的方法我們就寫完了,接下來編譯,編譯完成後Dagger2會生成一個類,這個類是我們初始化對象所用到類,該類的命名服從Dagger+連接器名稱的規則,該類源碼如下:
public final class DaggerComponent1 implements Component1 { private MembersInjector<MainActivity> mainActivityMembersInjector; private DaggerComponent1(Builder builder) { assert builder != null; initialize(builder); } public static Builder builder() { return new Builder(); } public static Component1 create() { return builder().build(); } @SuppressWarnings("unchecked") private void initialize(final Builder builder) { this.mainActivityMembersInjector = MainActivity_MembersInjector.create(Dagger_data1_Factory.create()); } @Override public void inject(MainActivity activity) { mainActivityMembersInjector.injectMembers(activity); } public static final class Builder { private Builder() {} public Component1 build() { return new DaggerComponent1(this); } } }
這樣,我們就可以通過該類來創建我們需要創建的對象了
DaggerComponent1.builder().build().inject(this);//this在這裏是MainActivity
OK,對象創建完畢,我們直接使用對象裏面的方法就可以data1.getA();
結果出來是10.