转自:http://www.apkbus.com/blog-705730-60435.html

什么是依赖注入

如果我们想要注入依赖,首先要理解依赖是什么。简单的说,依赖是我们代码中两个模块之间的耦合(在面向对象语言中,指的是两个类),通常是其中一个模块使用另外一个提供的功能。

为什么依赖是危险的?

从上层到底层依赖都是危险的,因为我们在某种程度上把两个模块进行耦合,这样当需要修改其中一个模块时,我们必须修改与其耦合的模块的代码。这对于创建一个可测试的app来说是很不利的,因为单元测试要求测试一个模块时,要保证它和app中其他模块是隔离的。为了做到这一点,我们需要使用mocks代替依赖,想象一下这样的代码:

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

如何在不测试doSomethingElse函数的前提下测试doSomething函数呢?如果测试失败,是哪个函数导致的呢?我们不得而知。如果doSomethingElse函数在数据库中保存数据或者向服务器端发起API请求,那么事情将变得更加糟糕。

每当敲下new关键字我们都应该意识到这可能是需要避免的强依赖。编写更少的模块当然不是解决方案,不要忘记单一职责原则。

如何解决呢?依赖反转

如果不能在一个模块内部初始化另外的模块,那么需要以其他的形式初始化这些模块。你能想象如何实现吗?没错,通过构造函数。这基本上就是依赖反转原则的涵义了。你不应该依赖具体的模块对象,应该依赖抽象。

前面的代码应该修改为:

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

那么什么是依赖注入呢?

你已经知道了!它通过构造函数传递依赖(注入),从而把创建模块的任务从另一个模块内部抽离出来。对象在其他地方创建,并以构造函数参数的形式传递给另一个对象。

但新问题出现了。如果我们不能在模块内部创建其他的模块,那么必须有个地方对这些模块进行初始化。另外,如果我们需要创建的模块的构造函数包含大量的依赖参数,代码将变得丑陋和难以阅读,app中将存在大量传递的对象。依赖注入正是为解决这类问题而诞生的。

什么是依赖注入器?

我们可以把它理解成app中的另一个模块,专门负责提供其他模块的实例并注入他们的依赖。这是它的基本义务。模块的创建集中于app中的一个统一的入口,我们对它有完全的控制权。

最后,什么是Dagger?

Dagger是专为低端设备设计的依赖注入器。大部分依赖注入器通过反射来创建和注入依赖。反射机制是很棒的,但在低端设备上面耗时严重,特别是在老的android版本上面。然而,Dagger使用预编译器创建工作所需的所有类。这样一来,就不需要用到反射了。Dagger相比其他依赖注入器功能稍弱,但却是效率最高的。

Dagger只是用于测试吗?

当然不是!它使得在其他app中重用你的模块变得容易,或者在相同的app中改变这些模块。想象这样一个例子:你的app在debug模式下需要从本地文件中读取数据,而在release模式下需要从服务器端API请求中获取这些数据。完全有可能通过在不同的模式下注入不同的模块来实现。

结论

我知道这篇文章有点难度,但我认为在继续下一篇文章之前,有必要把基本概念先明确好。我们已经知道什么是依赖,通过依赖反转改进了什么以及我们如何通过依赖注入器实现它。

Dragger简介的更多相关文章

  1. OSG中的示例程序简介

    OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...

  2. OSG中的示例程序简介(转)

    OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...

  3. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  4. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  5. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  6. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  7. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

  8. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  9. HTTPS简介

    一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...

随机推荐

  1. 省队集训day6 C

    Description 给定平面上的 N 个点, 其中有一些是红的, 其他是蓝的.现在让你找两条平行的直线, 使得在保证    不存在一个蓝色的点 被夹在两条平行线之间,不经过任何一个点, 不管是蓝色 ...

  2. 判断鼠标从哪个方向进入--jQuery

    转载自:http://sentsin.com/web/112.html $("#wrap").bind("mouseenter mouseleave",func ...

  3. yo angualr-fullstatck 项目打包部署

    yoeman使用grunt进行打包部署,直接运行grunt命令即可,期间会对代码进行检查,如果存在不规范的地方jshint会指定出来. grunt会对静态资源进行打包而且对资源文件名进行了MD5作为版 ...

  4. UVA11388 GCD LCM(数论)

    题目链接. 题意: 给定两个数,一个G,一个L,找出两个数a,b(a<=b),使得这两个数的最大公约数为G,最小公倍数为L,且(a最小). 分析: 当a,b存在时,a一定为G. 自己证了一下,数 ...

  5. 【转】spin_lock & mutex_lock的区别? .

    原文网址:http://blog.csdn.net/wilsonboliu/article/details/19190861 本文由该问题引入到内核锁的讨论,归纳如下   为什么需要内核锁? 多核处理 ...

  6. uglifyjs压缩js文件(指令压缩/ 批量压缩/ 编程方式压缩)

    一.指令压缩 1.安装node,npm——详细见nodejs安装与使用入门 2.安装 uglifyjs——npm install -g uglify-js 3.压缩例子:1)uglifyjs  mai ...

  7. Minimum Path Sum——LeetCode

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  8. [Design Pattern] Factory Pattern 简单案例

    Factory Pattern , 即工厂模式,用于创建对象的场景,属于创建类的设计模式 . 下面是一个工厂模式案例. Shape 作为接口, Circle, Square, Rectangle 作为 ...

  9. Codeforces Round #232 (Div. 1) A 解题报告

    A. On Number of Decompositions into Multipliers 题目连接:http://codeforces.com/contest/396/problem/A 大意: ...

  10. B - Dining - poj 3281(最大流)

    题目大意:有一群牛,还有一些牛喜欢的食物和喜欢的饮料,不过这些牛都很特别,他们不会与别的牛吃同一种食物或者饮料,现在约翰拿了一些食物和饮料,同时他也知道这些牛喜欢的食物和饮料的种类,求出来最多能让多少 ...