依赖注入框架 Dagger2 的全面讲解

一线开发多年,带队研发过超百万级项目,对多媒体,音视频,Android源码有一定的研究,开源项目AndroidCamera创建者,公众号「aserbaocool」维护者,知识变现的践行者。微信「lezhu5201314」。

文章正文

前言

进入正文之前,首先得感谢各位的支持,让文章很快就达标了,虽然后期预定的人数不多,但是有你们的支持,对我来说已是万幸,谢谢各位。

其实 Dagger 2 在这之前我也是知其然不知其所以然,说到底是没想过去用这个框架。但是为什么这次花点时间来整理这篇么一篇文章呢?

  • 其一是想开发一个自己的 App,希望将 Dagger 2 接入进去,权当学习参考用;
  • 其二是之前群里有同行在问我这个问题,没用过不熟悉就没有发言权。

基于这两点,导致自己想趁有时间就整理一波关于 Dagger 2 的相关知识。

简单讲一下文章的思路:整篇文章通过实例和代码相结合的方式进行,从案例去分析实现原理,站在一个初学者的角度去编写整篇文章。

文章主要分四部分:

  • 第一部分:Dagger 2 是什么以及怎么用为什么要这么用?
  • 第二部分:通过 Demo 讲 Dagger 2 的使用方法。
  • 第三部分:对 Dagger 2 的 API 进行详细讲解。
  • 第四部分:总结以及参考链接地址。

文章所有代码地址请点击这里

个人能力有限,若文章有不对之处,望指出,感激不尽。文章若有修改会在个人公众号 aserbao 通知大家。OK,话不多说,咱们进入正题。

什么是从属依赖关系?

在学习 Dagger 2 之前,我们首先需要了解什么是从属依赖关系。

举个简单的例子,比如说 Car 和 Wheel,Car 是由 Wheel 组成,Wheel 又属于 Car,这就是一个简单的从属依赖关系。Android 中比较常见的比如:RecyclerView 和 Adapter,RecyclerView 依赖于 Adapter,而 Adapter 从属于 Adapter。见下图:

enter image description here

什么是 Dagger 2?

Dagger 是一个完全静态的编译时依赖注入框架,适用于 Java 和 Android。它是由 Square 创建的早期版本的改编版,现在由 Google 维护。Dagger 2 主要有三个部分组成,即 @Module 标记的 module、@Component 标记的 Component、@Inject 标记的使用目标类层。关系图如下:

dd0c340b445c82a1e40891b11be1c01c.png

为什么要用 Dagger 2?

开发速度更快,使得代码的耦合度更低。接下来咱们通过实例来体验 Dagger 2 带来的便利。

使用 Dagger 2 之前的准备工作

导包

最新包请参考 Dagger 2 的 GitHub 地址上的最新版本,当前最新版本是 2.21,所以下面的 2.x 用 2.21 替代。

Android Gradle:

// Add Dagger dependencies
dependencies {
  implementation 'com.google.dagger:dagger:2.x'
  annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
}

如果你想使用 Dagger.andorid 包下的类文件,你可以多导一个包,如下:

implementation 'com.google.dagger:dagger-android:2.x'
implementation 'com.google.dagger:dagger-android-support:2.x' // if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-android-processor:2.x'

Dagger 2 怎么用?

接下来我们通过一个简单的 Demo 来进行 Dagger 2 的讲解。

Dagger 2 的使用步骤

  1. 识别依赖对象及其依赖项
  2. @Module 使用 @Provides 标记创建一个类,为每个返回依赖关系的方法使用标记
  3. 使用 @Inject 标记请求依赖对象中的依赖项
  4. 使用 @Component 标记创建接口,并使用 @Module 在第二步中创建的标记添加类
  5. 创建 @Component 接口的对象以使用其依赖项实例化依赖对象

一个简单的 Demo

咱们现在接到这样一个需求,Demo 的需求设计如下:

a68c785d1b4e1fcc89d15bdca63e8209.png

OK,接到需求,咱们开始写代码,在不使用 Dagger 2 的情况下,比如我要调用 Car 对象中的 drive() 方法,我们会这样做(这里省略所有的实体类的代码,代码在 AserbaosAndroid 搜索 DaggerActivity 即可):

……other Code

public void normal(){
        Block block = new Block();   
        Cylinder cylinder = new Cylinder();
        SparkPlug sparkPlug = new SparkPlug();
        Tire tire = new Tire();
        Rim rim = new Rim();
        Engine engine = new Engine(block,cylinder,sparkPlug);
        Wheel wheel = new Wheel(rim,tire);
        Car car = new Car(wheel,engine);
        car.drive();
    }

使用 Dagger 2 的情况下,我们要调用 Car 中的 drive() 方法,代码如下。这里把实体类补上,区别在于使用 Dagger 2 的时候需要在构造方法中添加 @Inject 注解。

Block 类:

public class Block {
    @Inject
    public Block() {
    }
}

Cylinder 类:

public class Cylinder {
    @Inject
    public Cylinder() {
    }
}

SparkPlug 类:

public class SparkPlug {
    @Inject
    public SparkPlug() {
    }
}

Engine 类:

public class Engine {
    Block block;
    Cylinder cylinder;
    SparkPlug sparkPlugs;

    @Inject
    public Engine(Block block, Cylinder cylinder, SparkPlug sparkPlugs) {
        this.block = block;
        this.cylinder = cylinder;
        this.sparkPlugs = sparkPlugs;
    }

}

Tire 类:

public class Tire {
    @Inject
    public Tire() {
    }
}

Rim 类:

public class Rim {
    @Inject
    public Rim() {
    }
}
作者正在撰写中...
隐藏内容 支付可见
内容互动
写评论
加载更多
评论文章
¥4.99 购买
× 订阅 Java 精选频道
¥ 元/月
订阅即可免费阅读所有精选内容