Wen

Android Dagger2 学习笔记 (上) - 讲 Dagger 之前

现在Github里的Andorid Demo中随处可见Dagger2的身影,作者们已经开始默认读者朋友具备Dagger2的知识了,可是我还不具备啊,不过也不捉急,先学习一些简单实用的基本知识。

依赖注入概念


开始介绍 Dagger 前还是想从基本概念说起,推荐阅读下面这篇文章,文中的概念本文也会简单介绍:

使用Dagger2前你必须了解的一些设计原则

依赖 (dependency)

在之前的文章《Android MVP学习笔记 (中) - Google todo-mvp Demo》中,介绍了TasksPresenter的代码如下所示:

1
2
3
4
5
6
7
8
public class TasksPresenter implements TasksContract.Presenter {
private final TasksContract.View mTasksView;
...
@Override
public void addNewTask() {
mTasksView.showAddTask();
}
...

那对于TasksPresenter来说,mTasksView就是它的依赖。

依赖反转原则(Dependency inversion principle,DIP)

在这个关系中有个设计原则叫依赖反转原则,下面定义引用自维基百科

在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。
该原则规定:

  1. 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。
  2. 抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。

其实就是说,依赖关系中要通过抽象接口来连接高层次模块和低层次模块,而且接口的设计是和具体实现无关的。上面这个例子中,TasksPresenter是高层次模块,mTasksView是低层次模块,这里也是用了TasksContract.View这个接口来连接两者。这样的好处是如果之后需要换一个View,只需要让新的View实现同样的接口就好了,而不需要大改TasksPresenter里的代码。

依赖注入

知道了依赖的概念,和要通过接口来连接依赖关系,那什么是依赖注入呢?它说的是:得到依赖的引用的方式。前面说了,依赖在类中应该是以接口的形式存在,那么它的实现类的初始化发生在哪里呢?不在当前类里面初始化具体的依赖实现类,而是外部初始化好并传入当前类,这就是依赖注入。

依赖注入的好处是,当依赖的具体实现类发生改变的时候,就彻底不用改依赖的引用类了,因为在依赖的引用类里面完全没有对依赖具体实现类的引用。

最简单的两种依赖注入实现方式,一种是Constructor Injection, 即在构造函数中传入依赖。还是上面那段代码,来看mTasksViewTasksPresenter类里的引用得到过程:

1
2
3
4
5
6
7
8
9
public class TasksPresenter implements TasksContract.Presenter {
private final TasksContract.View mTasksView;
...
public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) {
mTasksView = checkNotNull(tasksView, "tasksView cannot be null!");
...
}
...
}

第二种是Setting Injection,即通过setter传入引用。看PresenterTasksFragment类里的引用得到过程:

1
2
3
4
5
6
7
8
9
public class TasksFragment extends Fragment implements TasksContract.View {
private TasksContract.Presenter mPresenter;
...
@Override
public void setPresenter(@NonNull TasksContract.Presenter presenter) {
mPresenter = checkNotNull(presenter);
}
...
}

Dagger2 也是依赖注入的其中一种形式,下一篇文章再学习其相关知识。

转载请注明出处:http://zhaowen.io/post/dagger2/