煎饼

煎饼为你分享Android有关的技术文章
不断分享,点滴积累,共同提高

关注微信公众号[developers]
更快的了解新的技术动态

Dagger on Android-基础篇

之前有写过两篇文章

Android 依赖注入:Dagger 实例讲解(Demo下载)

Android 依赖注入:Dagger 2 实例讲解(一)

来讲解如何使用 Dagger1Dagger2,没有更多来解释一下理论的东西。然后有些朋友就来问我,为什么要花费一定的时间来学习Dagger,而且还那么复杂,不易明白。其实,刚开始我也这么觉得,不过随着学习的深入及在项目中使用过程中发现的一些问题,越来越觉得应该去学习了解Dagger。接下来的数篇文章我会解释什么是依赖注入(Dependency injection),它的作用是什么,以及再次详细的介绍Dagger1Dagger2的使用。

在开始详细介绍 Dagger1 和 Dagger2之前,我们先来了解一下依赖注入(Dependency injection)的基本理论,这可以使我们理解它的作用及为什么会存在,免得我们花费了很多功夫却一点东西也没学到。

依赖(Dependency)是什么?

如果我们想要注入依赖(inject dependencies),我们就要知道依赖(dependency)是什么。简单的说,依赖在代码中两个modules(面向对象语言中的两个类)之间就像是夫妻关系,一个依赖另个一来做一些事。

依赖(Dependency)存在风险?

从高级到低级的依赖是有风险的,如果我们使用个一module来改变另一个module,我们也需要去修改与之结对module。在测试App中这是非常不好的,因为在单元测试中,如果我们要测试一个module,就必须把这个module与其他的分割开。看下面代码:

public class Module1{
   private Module2 module2;
   public Module1(){
      module2 = new Module2();
   }
   public void doSomething(){
      ...
      module2.doSomethingElse();
      ...
   } 
}

我们怎样在不测试 doSomethingElse 方法的情况下测试 doSomething? 如果测试失败了,我们也不知道到底是哪个方法引起的,如果 doSomethingElse操作了数据库保存了数据或者调用了一些API,就会变得更复杂。我们要尽量避免使用new,因为这是一种硬依赖(hard dependency).

如何解决?控制反转(Dependency inversion)

如果我们不能在一个module里实例化另一个module,我们需要通过其他方法来提供这些modules。你想到怎么实现了吗?对,通过构造器,这也符合控制反转的原则。注意,我们依赖的不是一个具体的module 对象,而是抽象的。看如下代码:

public class Module1{
   private Module2 module2;
   public Module1(Module2 module2){
      this.module2 = module2
   }
   public void doSomething(){
      ...
      module2.doSomethingElse();
      ...
   } 
}

*注:Module2是Module1的依赖,Module1依赖Module2来做一些事情*

什么是依赖注入(Dependency injection)

结合上例,简单的说就是在Module创建的时候,将它所依赖的另一个Module通过构造器传递给它,也叫注入。

但是这样会有一个新的问题,如果我们不在里一个Module里创建它所依赖的其他Module,那这些被依赖的Module会在其他地方被实例化,另外,当前Module的构造器会包含多个依赖,代码会变的dirty,也不易阅读。怎么解决这个问题?这就需要一个依赖注入器(Dependency injector)了.

什么是依赖注入器(Dependency injector)

可以认为他是一个Module,基本功能就是负责提供其他Modules的实例化对象和注入它们间的依赖。

最后...什么是Dagger

Dagger 英文的意思是“匕首🗡️”,它是为低端设备设计的一种依赖注入器。很多依赖注入器使用反射(Reflection)创建和注入依赖。反射技术令人赞叹,但在低端设备上是非常耗时的,尤其是在旧的Android设备上。Dagger 在编译时就会产生它所需的所有类,这样就不需要使用反射了。Dagger虽然没有其他依赖注入器功能强大,但它是最高效的。

不知道读到这里有没有使你对Dependency injection 和 Dagger 有些了解。了解这些会使你更快的理解接下来的文章所讲的一些内容,使用Dagger会为我们带来那些方面的提高,请等待下篇。

1204

分享本文:

Dagger on Android-Dagger1介绍