Dagger 2 系列(三) -- 基础篇:@Module 和 @Provides

Dagger2

在这篇文章中你会看到什么:
1. @Inject 是什么
2. @Component 是什么
3. @Inject@Component 如何协同作战。

1. 前提

在介绍他们之前我们来看一段我们在项目中看到的类似的代码:

public class ClassA{
    ClassB classB = new ClassB();
    ClassC classC = new ClassC("xxx",xxx);
    .....
}

如你所见,当我们在目标类初始化其他类时,这些工作几乎都是重复性的操作,我们可不可以用一种方案来替代这种操作,这时我们所使用的 Dagger2 的成员 @Inject@Component 就跳出来了,大声喊道:我可以~~~

2. @Inject 是什么?

@Inject为了实现以上功能,需要用注解 @Inject (Annotation)来标注目标类中所依赖的其他类,同样用注解来标注所依赖的其他类的构造函数。

    public class ClassA{

        @Inject
        ClassB classB;
        @Inject
        ClassC classC;

    }

public class ClassB{
    @Inject
    public ClassB(){}
    ....
}

public class ClassC{
    @Inject
    public ClassC(XXX xxx, XXX xxx){
        ...
    }
}

虽然目标类和所依赖类都使用了@Inject 来标记,但是他们并没有产生实在意义上的联系,这时 @Component 就充当了媒婆的角色。

3. @Component 是什么?

很明显@Component 是一个注解,那么被 @Component 标记的类理所当然的被称为注解类,并且该类必须是接口或抽象类。那么下面我们看一下这个媒婆是怎么开展工作的:
1.@Component 标注类的实例必须存在目标类中
2.Component会查找目标类中用 @Inject 注解标注的属性
3. 查找到相应的属性后,会接着查找该属性对应的用@Inject标注的构造函数(这时候就发生联系了)
4. 剩下的工作就是初始化该属性的实例并把实例进行赋值
具体过程如下图:
@Inject 和 @Component 协同过程流程图

4. 总结

到此为止,我们已经实现了基本的基于Dagger2的依赖注入。下面我们把过程再梳理一遍:

  1. @Inject注解标注目标类中其他类
  2. @Inject注解标注其他类的构造函数
  3. 若其他类还依赖于其他的类,则重复进行上面2个步骤
  4. 调用Component(注入器)的injectXXX(Object)方法开始注入(injectXXX方法名字是官方推荐的名字,以inject开始)

Component 就像目标类相应依赖类的媒介,把目标类依赖的实例注入到目标类中,来初始化目标类中的依赖。

5.参考文章


Dagger 详解
这就是Dagger2
Dagger2 入门实践
Android:dagger2让你爱不释手-终结篇
最简单的Dagger2入门教程
Android:dagger2让你爱不释手-基础依赖注入框架篇

猜你喜欢

转载自blog.csdn.net/strange_monkey/article/details/80528921