依賴注入之Dagger2初探

weixin_34208283發表於2018-01-10

Dagger2

    Dagger2是Google提供的依賴注入框架,依賴注入為Android中元件之間的解耦提供了很好的解決方案。Dagger2已經在越來越多的開源專案中被使用,其已經發展成為未來的一個技術趨勢。

為什麼要使用Dagger2

    MVP設計模式中,M層提供資料,V層做介面展示,而P層則成為M和V的橋樑,這其中就必然涉及到M和V的互動及處理,如果業務複雜或者多個頁面共用,它還是面臨著高度的耦合性。如果需求發生變動,必然需要更改P中的內容。而在MVP中,我們通常在activity層中需要拿到p層的物件,那麼在開發中有可能我們很多activity或者fragment都可能需要拿到這個p層物件的例項,假如我們P層類的構造發生變化我們要在很多地方都得進行修改,這就是耦合度太高的弊端。為了解決這種耦合性的問題,有一幫牛叉的人就思索著:能不能有個容器,這個容器在我們需要用到某個物件的時候幫我們建立好需要的物件,像物件工廠一樣,並且幫我們管理這些物件。當發生變化時,我們只需要換一個容器就可以了。就這樣,dagger2應運而生。

dagger2中組成內容的對應關係:

類Module:裝載物件的容器。

介面Component:存放這些容器的倉庫。

註解Provides:該容器建立物件的動作。

註解Inject:從容器中取出這個物件的動作。

註解Qualifier:用來給Inject和Provides貼上關聯標籤。如果一個物件可以由多個容器提供,這時候就需要用Qualifier進行標籤關聯。

註解Scope:從容器取出物件的有效期,即生命週期。


如何使用Dagger2

1.增加Dagger2依賴包

dependencies {

    implementation 'com.google.dagger:dagger:2.13'

    annotationProcessor 'com.google.dagger:dagger-compiler:2.13'

    compileOnly 'org.glassfish:javax.annotation:10.0-b28'

}

2.編寫Module

@Module

public class LoginModule {

    @ActivityScope

    @Provides

    LoginPresenter getPresenter() {return new LoginPresenter();}}

3.編寫Component

@ActivityScope

@Component(modules = {LoginModule.class})

public interface LoginComponent {

    void inject(LoginActivity activity);

}

4.編譯一下工程

    AndroidStudio -> Build -> Make Project

5.依賴注入

@Override

protected void onResume({

    super.onResume();

    DaggerLoginComponent.builder().build().inject(this);

    mPresenter.attachV(this);

}

Demo工程

github專案

相關文章