依赖注入?Dagger?

原创 2016年06月06日 21:12:50

有一个Dagger框架好像特别火,在好多地方都可以见到它的身影,这不禁让我**一紧,难道这又是什么牛逼的技术吗?赶紧上网查查,这玩意是干什么用的,一查不要紧,
只是顿时感觉有点懵逼,依赖注入???,”依赖注入“这几个字好像在那听到过,但是,这到底是啥玩意?有啥用?为啥会出现个这东西呢?

如果各位看了上面的一段话,感觉和博主产生了共鸣,那我要告诉你,这篇文章适合你!

什么是依赖?

如果我们想注入依赖,我们首先要知道依赖是什么,简单来说,依赖就是两个代码模块之间的连接,在面向对象语言中可以说是两个类, 通常一个类要利用另一个类来做一些事情。

依赖是有隐患的,为什么?

依赖存在隐患,因为我们把两个模块绑定在了一起,这样,如果我们需要改变其中的一个模块,我们必须对这个模块进行调整,对于测试来说这种设计方式是非常糟糕的,因为当我们做单元测试的时候,测试一个模块,要把其他的模块分离出去,看以下代码:

public class Module1{
   private Module2 module2;

   public Module1(){
      module2 = new Module2();
   }

   public void doSomething(){
      ...
      module2.doSomethingElse();
      ...
   } 
}

我们怎么能在不测试doSomethingElse方法的情况下对doSomething进行测试?如果测试失败,究竟是doSomethingElse出错,还是doSomething出错?这非常难辨别。特别是在doSomethingElse方法在数据库中存储了数据,或者执行了其他的API方法,对于测试就更复杂了。

怎么解决依赖存在的隐患?依赖反转

通过前一段我么知道,在一个模块的内部去实例化另一个模块会存在隐患,因此我们需要用另一种方法来实现依赖,什么方法?通过构造方法,改造先前的代码:

public class Module1{
   private Module2 module2;

   public Module1(Module2 module2){
      this.module2 = module2
   }

   public void doSomething(){
      ...
      module2.doSomethingElse();
      ...
   } 
}

看出什么不同了吗?我们把一个模块通过构造方法传给了另一个模块。有什么差别吗?差别大了去了,第一种方式我们直接在模块中new 对象,此对象是不可更改的,就是我们定义的类的对象,但是第二种方式是可以通过多态的原理来传入我们定义的子类的,通过这种方式实现两者之间的解耦。

那什么是依赖注入呢?

通过上面已经了解了,一个模块被另一个模块依赖的时候,通过构造方法来传递对象是一个比较好的方法,但是这有一个问题,我们不在模块的内部创建对象,就必须找一个地方创建对象,还有就是如果依赖多个模块,那么构造函数会变得非常臃肿,而依赖注入要解决的就是此问题。

什么是Dagger?

Dagger是为低端设备设计的依赖注入框架,大多数的依赖注入依靠反射的机制来创建和注入对象,确实,反射很强大,但是它会影响效率,特别是在低端的设备上,就更明显了,而Dagger使用了预编译的方式来创建它需要的类,不需要反射,虽然Dagger可能没有其他的依赖注入那么强大,但是它的效率非常高。

Dagger仅仅用于测试吗?

这不是搞笑吗?如果真是这样,我干嘛还要写此博客,其实,它的强大之处在于,它可以让我们在不同的app中重用我们的模块,或者在同一个app中,想象一下,有这样一种场景,一个app在测试的时候从本地文件获取数据,但是在发布的时候从服务器获取数据,此时就可以利用依赖注入来实现。

最后

如果以前没有接触过依赖注入,理解这个概念确实不是很简单,但是依赖注入对于开发还是非常有用的,希望各位多多理解吧!

参考资料:http://antonioleiva.com/dependency-injection-android-dagger-part-1/

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

Dagger 是一种android平台的依赖注入框架,是有一家专注于移动支付的公司,Square公司推出的库,这家公司也推出了 其他在Android开发中常用库:otto,okhttp,retrofi...
  • zjbpku
  • zjbpku
  • 2014年01月24日 23:50
  • 26434

安卓开发 第一篇 关于依赖注入框架dagger2的使用和理解

(这篇博客真是磨难重重啊,写到一半电脑蓝屏了,还好markdown编辑器保持了部分类容)最近开始重构项目,在重构项目中用到了依赖注入框架dagger2,发现它确实很方便,能大大加快我们编写代码的速度,...
  • naivor
  • naivor
  • 2016年04月14日 22:31
  • 5585

Android快速依赖注入框架Dagger2使用1

一、啥是Dagger2前面的概念可能开始看不懂,给点耐心,看到例子就懂了。 本篇文章需要注解方面的知识,不了解的可以先看:http://blog.csdn.net/niubitianping/arti...
  • niubitianping
  • niubitianping
  • 2017年03月08日 18:22
  • 2445

Dagger2实现依赖注入之一步一步带你入门

一、首先你要知道什么是依赖? 想要理解Dagger2,首先你要理解一个概念,就是什么是依赖,懂的同学可以省过此段。这里给大家举个通俗易懂的例子,让你秒懂什么是依赖,你今天去办港澳通行证,出入境告诉...
  • Interface_l
  • Interface_l
  • 2017年04月10日 14:21
  • 621

依赖注入利器 - Dagger ‡

转载请标明出处:http://blog.csdn.net/shensky711/article/details/53715960 本文出自: 【HansChen的博客】 概述 声明需要注入的对象...
  • shensky711
  • shensky711
  • 2016年12月17日 22:53
  • 1940

使用Dagger 2进行依赖注入 - API介绍

Dagger 2 依赖注入
  • lihenair
  • lihenair
  • 2016年05月16日 14:32
  • 2799

android依赖注入框架Dagger和Butterknife实战

依赖注入(DependencyInjection):在类A中要用到一个B的对象(依赖),需要通过新建B的实例或其他一些主动的方式来获取对象,然后才能调用。而通过外部的方式自动将B的对象分配给A(注入)...
  • u012995514
  • u012995514
  • 2015年07月05日 00:37
  • 3364

Dagger,ButterKnife,Roboguide,AndroidAnnotations框架的依赖注入浅析

Dagger,ButterKnife,Roboguide,AndroidAnnotations框架的依赖注入浅析 Dagger ---专业为Android打造的依赖注入(DI)框架 简述:...
  • TryIT1993
  • TryIT1993
  • 2014年10月18日 13:21
  • 4904

Android开源框架——依赖注入Dagger

介绍:Dagger是Square公司开发依赖注入框架,主要针对辅助类对象,而ButterKnife是针对View视图对象的。github:https://github.com/square/dagge...
  • WiseClown
  • WiseClown
  • 2016年06月07日 19:38
  • 324

Android —— Dagger依赖注入库

Dagger2介绍Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagger1 由Square公司开发。依赖注入框架主要用于模块间解耦,提高代码的健壮性和可维护性。Dagge...
  • womengmengyan
  • womengmengyan
  • 2016年09月21日 15:06
  • 300
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:依赖注入?Dagger?
举报原因:
原因补充:

(最多只允许输入30个字)