Dragger简介
转自: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简介的更多相关文章
- OSG中的示例程序简介
OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...
- OSG中的示例程序简介(转)
OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
随机推荐
- 省队集训day6 C
Description 给定平面上的 N 个点, 其中有一些是红的, 其他是蓝的.现在让你找两条平行的直线, 使得在保证 不存在一个蓝色的点 被夹在两条平行线之间,不经过任何一个点, 不管是蓝色 ...
- 判断鼠标从哪个方向进入--jQuery
转载自:http://sentsin.com/web/112.html $("#wrap").bind("mouseenter mouseleave",func ...
- yo angualr-fullstatck 项目打包部署
yoeman使用grunt进行打包部署,直接运行grunt命令即可,期间会对代码进行检查,如果存在不规范的地方jshint会指定出来. grunt会对静态资源进行打包而且对资源文件名进行了MD5作为版 ...
- UVA11388 GCD LCM(数论)
题目链接. 题意: 给定两个数,一个G,一个L,找出两个数a,b(a<=b),使得这两个数的最大公约数为G,最小公倍数为L,且(a最小). 分析: 当a,b存在时,a一定为G. 自己证了一下,数 ...
- 【转】spin_lock & mutex_lock的区别? .
原文网址:http://blog.csdn.net/wilsonboliu/article/details/19190861 本文由该问题引入到内核锁的讨论,归纳如下 为什么需要内核锁? 多核处理 ...
- uglifyjs压缩js文件(指令压缩/ 批量压缩/ 编程方式压缩)
一.指令压缩 1.安装node,npm——详细见nodejs安装与使用入门 2.安装 uglifyjs——npm install -g uglify-js 3.压缩例子:1)uglifyjs mai ...
- 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 ...
- [Design Pattern] Factory Pattern 简单案例
Factory Pattern , 即工厂模式,用于创建对象的场景,属于创建类的设计模式 . 下面是一个工厂模式案例. Shape 作为接口, Circle, Square, Rectangle 作为 ...
- Codeforces Round #232 (Div. 1) A 解题报告
A. On Number of Decompositions into Multipliers 题目连接:http://codeforces.com/contest/396/problem/A 大意: ...
- B - Dining - poj 3281(最大流)
题目大意:有一群牛,还有一些牛喜欢的食物和喜欢的饮料,不过这些牛都很特别,他们不会与别的牛吃同一种食物或者饮料,现在约翰拿了一些食物和饮料,同时他也知道这些牛喜欢的食物和饮料的种类,求出来最多能让多少 ...