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 ...
随机推荐
- phalcon的一些中文手册和帮助文档地址收集
1:中文官方网站:http://phalconphp.com/zh/ 挺好可以好好看文档 可安装http://bullsoft.org/phalcon-docs/这个去查找,这是个部分中文的手册! P ...
- POJ 3356(最短编辑距离问题)
POJ - 3356 AGTC Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Desc ...
- UVA - 1153 Keep the Customer Satisfied(贪心)
UVA - 1153 Keep the Customer Satisfied Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: ...
- IIS 10 安装URLRewrite组件 方式
1.Open Regedit > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp 2.Edit "MajorVersion" an ...
- 30 个 Python 语言的特点技巧
1 介绍 从我开始学习Python时我就决定维护一个经常使用的“窍门”列表.不论何时当我看到一段让我觉得“酷,这样也行!”的代码时(在一个例子中.在StackOverflow.在开源码软件中,等等 ...
- tomcat正常启动,但IP不能访问web。ping IP地址,一直超时。 用ipconfig命令修复TCP/IP的配置信息
今天遇到一个好奇葩的问题 好吧是昨天遇到的一直没找到解决办法(`へ´) tomcat正常启动,但是通过IP不能访问web 用IP地址就是不行 (:′⌒`) 打不开 localhost就可以 ...
- java线程同步问题
Java面试当中,线程可以说是必考内容,在看面试题的时候发现一遍很全的讲解Java面试题的博客:http://blog.csdn.net/csh624366188/article/details/80 ...
- 001Spring4.2基本环境搭建
1:工程目录以及依赖jar包如下,如果缺少某些jar包在weblogic控制台下面会有提示 2:applicationContext.xml配置文件 <?xml version="1. ...
- 【Maven实战】依赖的聚合和版本管理
1.在之前的文章中,我们已经建立了四个Maven项目,但是此时如果我们要对这四个项目进行编译打包时,必须一个一个的进行执行命令,而聚合就是指只要我们在其中一个项目中编写一些代码,则在进行此项目的编译和 ...
- hdu Co-prime
题意:求出在一个区间[A,B]内与N互质的个数 . 思路: 先求出n的质因子,然后求出与N的质因子不互质的个数然后总个数减去就是.用位运算二进制表示那个因子用到过,实现容斥原理.在1到n之间是c倍数的 ...