Dagger2簡談

目前Dagger有兩個分支,一個square維護,一個為Google在前者的基礎上開出的分支,即Dagger2。今天我們只談dagger2。

Dagger2使用原因

Dagger2是一個依賴注入的框架,那什么是依賴注入呢?依賴注入式一種面向對象的編程模式,它的出現是為了降低耦合性,所謂耦合就是類之間依賴關系,也就是降低類之間的依賴關系。

依賴注入原理

?在軟件工程領域,依賴注入是用于實現控制反轉(IoC)的最常見的方式之一。IoC不是什么技術,而是一種設計思想,在Java開發中,IoC意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。

依賴注入的實現方式:1.構造函數注入 2.setter注入 3.接口注入

Dagger2引入

??添加apt插件

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

添加依賴(build.gradle中添加)

apply plugin: 'com.neenbedankt.android-apt'

dependencies {

...

compile 'com.google.dagger:dagger:2.7'

apt 'com.google.dagger:dagger-compiler:2.7'

...

}

這里我們使用的是apt插件

APT(Annotation Processing Tool)是一種處理注釋的工具,它對源代碼文件進行檢測找出其中的Annotation,根據注解自動生成代碼。 Annotation處理器在處理Annotation時可以根據源文件中的Annotation生成額外的源文件和其它的文件(文件具體內容由Annotation處理器的編寫者決定),APT還會編譯生成的源文件和原來的源文件,將它們一起生成class文件

annotationProcessor和android-apt的功能是一樣的,它們是替代關系。所以你可能會在其他文章或者項目中看到上面兩種依賴的方式,至于他們的區別,鏈接我會放在文章下方。

Dagger2使用

在項目中絕大多數的使用都是Dagger結合MVP架構使用的,在MVP中使用時非常典型的降耦合的使用。

在MVP模式中activity持有presenter的引用,同時presenter也持有View的引用,這樣便于更新UI界面,這樣presenter就和activity緊緊的耦合在一起了,而dagger2是依賴注入框架就是耦合的。

新建目錄di

activity中代碼:

public abstract class BaseActivity extends AppCompatActivity implements IBaseView {

...

@Inject

AlbumDetailPresenter detailPresenter;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

mActivityComponet = DaggerActivityComponet.builder().activityModule(new ActivityModule(this)).build().inject(this);

}

}

AlbumDetailPresenter中代碼:

public class AlbumDetailPresenter implements IAlbumDetailPresenter {

@Inject
public AlbumDetailPresenter(@ContextLife("Activity") Context context) {
this.context = context;
}
}

新增ActivityComponent接口:

@Component(modules = ActivityModule.class)

public interface ActivityComponet {

void inject(BaseActivity aty);

}

新增ActivityModule類:

@Module

public class ActivityModule {

private final Activity mActivity;

public ActivityModule(Activity activity) {

mActivity = activity;

}

@Provides

@ContextLife("Activity")

public Context provideContext() {

return mActivity;

}

}

通過直接注解和上述接口和類即可完成Dagger2的依賴注入。在BaseActivity中是通過:

DaggerActivityComponent.builder().activityModule(new ActivityModule(this).build().inject(this))

完成注入的。

注意:添加@inject注解的變量不能被private修飾

我們可以這樣理解,被@inject注解的代碼存在某種聯系,當代碼執行到@inject的時候程序會自動進入到這個類的構造方法中,如果正巧這個構造方法也被@inject修飾了,那么系統就會幫我們自動創建對象。

在ActivityComponent接口中我們看到這么一個注解@Component(modules=ActivityModules.class),可見ActivityComponent需要ActivityModule一起才能完成工作。這個類我們也可以理解成是提供參數的,這里我們提供一個上下文給presenter的構造方法。

總結一下

·@Injet?程序會將dagger2會將帶有此注解的變量或者構造方法參與到依賴注入當中,dagger2會實例化這個對象。

.@Module?帶有該注解的類需要對外提供實例化需要的參數,dagger2在實例化的過程中發現一些參數,dagger2就會去該類中尋找帶有@provides注解對應的參數

.@Component?帶有該注解的接口或抽象類起到一個中介的作用,就是將帶有@Inject的方法或對象和帶有@Module的類進行關聯


參考:http://blog.csdn.net/xx326664162/article/details/68490059

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容