一、Dagger2是什么
? ? ? ? Dagger2是现在由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中,有两种主要的依赖项注入方式:
二、Dagger中常用Api及其作用了解
@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();
未完。。。
|