Dagger2簡談

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

Dagger2使用原因

Dagger2是一個(gè)依賴注入的框架,那什么是依賴注入呢?依賴注入式一種面向?qū)ο蟮木幊棠J剑某霈F(xiàn)是為了降低耦合性,所謂耦合就是類之間依賴關(guān)系,也就是降低類之間的依賴關(guān)系。

依賴注入原理

?在軟件工程領(lǐng)域,依賴注入是用于實(shí)現(xiàn)控制反轉(zhuǎn)(IoC)的最常見的方式之一。IoC不是什么技術(shù),而是一種設(shè)計(jì)思想,在Java開發(fā)中,IoC意味著將你設(shè)計(jì)好的對象交給容器控制,而不是傳統(tǒng)的在你的對象內(nèi)部直接控制。

依賴注入的實(shí)現(xiàn)方式:1.構(gòu)造函數(shù)注入 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)是一種處理注釋的工具,它對源代碼文件進(jìn)行檢測找出其中的Annotation,根據(jù)注解自動生成代碼。 Annotation處理器在處理Annotation時(shí)可以根據(jù)源文件中的Annotation生成額外的源文件和其它的文件(文件具體內(nèi)容由Annotation處理器的編寫者決定),APT還會編譯生成的源文件和原來的源文件,將它們一起生成class文件

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

Dagger2使用

在項(xiàng)目中絕大多數(shù)的使用都是Dagger結(jié)合MVP架構(gòu)使用的,在MVP中使用時(shí)非常典型的降耦合的使用。

在MVP模式中activity持有presenter的引用,同時(shí)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注解的代碼存在某種聯(lián)系,當(dāng)代碼執(zhí)行到@inject的時(shí)候程序會自動進(jìn)入到這個(gè)類的構(gòu)造方法中,如果正巧這個(gè)構(gòu)造方法也被@inject修飾了,那么系統(tǒng)就會幫我們自動創(chuàng)建對象。

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

總結(jié)一下

·@Injet?程序會將dagger2會將帶有此注解的變量或者構(gòu)造方法參與到依賴注入當(dāng)中,dagger2會實(shí)例化這個(gè)對象。

.@Module?帶有該注解的類需要對外提供實(shí)例化需要的參數(shù),dagger2在實(shí)例化的過程中發(fā)現(xiàn)一些參數(shù),dagger2就會去該類中尋找?guī)в蠤provides注解對應(yīng)的參數(shù)

.@Component?帶有該注解的接口或抽象類起到一個(gè)中介的作用,就是將帶有@Inject的方法或?qū)ο蠛蛶в蠤Module的類進(jìn)行關(guān)聯(lián)


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容