前一阵子项目里使用到Dagger,一直没时间整理,现在就整理一下Dagger的使用。
Dagger是现在由Google维护的一套依赖项注入框架,那什么是依赖注入呢?引用Google的话:
类通常需要引用其他类。例如,
Car
类可能需要引用Engine
类。这些必需类称为依赖项,在此示例中,Car
类依赖于拥有Engine
类的一个实例才能运行。类可通过以下三种方式获取所需的对象:
- 类构造其所需的依赖项。在以上示例中,
Car
将创建并初始化自己的Engine
实例。- 从其他地方抓取。某些 Android API(如
Context
getter 和getSystemService()
)的工作原理便是如此。- 以参数形式提供。应用可以在构造类时提供这些依赖项,或者将这些依赖项传入需要各个依赖项的函数。在以上示例中,
Car
构造函数将接收Engine
作为参数。第三种方式就是依赖项注入!使用这种方法,您可以获取并提供类的依赖项,而不必让类实例自行获取。
举个例子:
class Car {
private final Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.start();
}
}
class MyApp {
public static void main(String[] args) {
Engine engine = new Engine();
Car car = new Car(engine);//可以看到Car在构造的时候,注入了engine
car.start();
}
}
目前Android中,其实也是java中,有两种主要的依赖项注入方式:
构造函数注入。这就是上面描述的方式。您将某个类的依赖项传入其构造函数。
字段注入(或 setter 注入)。某些 Android 框架类(如 Activity 和 Fragment)由系统实例化,因此无法进行构造函数注入。使用字段注入时,依赖项将在创建类后实例化
@Inject //用来告知Dagger,如何构造一个类
@Inject
public A(B b, C c) {
this.b= b;
this.c= c;
}
在上面的代码段中,我们告诉 Dagger:
如何使用带有 @Inject
注释的构造函数创建 A实例。
它的依赖项为:B和 C
接下来我们需要告知Dagger怎么创建依赖项B和C:
public class C{
@Inject
public C() { }
}
public class B{
@Inject
public B() { }
}
@Component //用来绘制我们添加@Inject的对象的逻辑关系图,这样Dagger就可以我们生产实现依赖关系的代码了
@Component
public interface ApplicationComponent {
A callA();
}
rebuild之后,代码已经生成了,我们使用A怎么使用呢?
ApplicationComponent application = DaggerApplicationComponent.create();
A a = application.callA();
未完。。。