目前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 {
@Injectpublic 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