不久前本身曾研究过Dagger2,可是以为比较晦涩,再加上项目中没有运用到,就没有继续看下去。但近日发现 MVP + Retrofit + Rxjava + Dagger2 的 andoroid 项目框架如此流行,以为应接着搞一波了。html
Dagger2 是一个谷歌开源的依赖注入(Dependency Injection
)框架,简称DI
。Dagger2 是 Google 出的依赖注入框架。确定有小伙伴疑问,为何会有个 2 呢。该框架是基于 Square 开发的 Dagger 基础上开发的。 那么 什么是 依赖注入
呢?java
我在网上搜索了相关内容,以为如下解释相对容易理解(自定义后):git
IOC 容器
来完成,而后注入
到调用者。所以也被称为 依赖注入
。依赖注入
就是调用者须要的另外一个对象实例不在调用者内部实现,而是经过必定的方式从外部传入实例,解决了各个类之间的耦合
。那么这个外部,到底指的是哪里,若是指的是另外一个类,那么,另外一个类内部就耦合了,这种拆东墙补西墙的作法咱们是不推荐的。能不能有一种方式,将这些构造的对象放到一个容器中,具体须要哪一个实例时,就从这个容器中取就好了。那么,类的实例和使用就不在有联系了,而是经过一个容器将他们联系起来。实现了解耦。我的理解:控制反转 -- 把本身新建实例对象的权利由交给了第三方工具或容器。 目标类将建立其余实例类的权利交给了第三方工具,也就是说,原来须要程序员把自主在目标类经过 new 的方式建立相关类的实例的权利,交给具体的业务(所谓的 IOC 容器) ,该容器在须要的时候经过它本身的方式建立该类的实例,即:
建立类实例权利的移交
。程序员
依赖注入
就是调用者须要的另外一个对象实例不在调用者内部实现,而是经过必定的方式从外部传入实例,解决了各个类之间的耦合
。github
通俗一点讲:将该对象的实例化交给其调用者,经过某种方式传入进来,这种模式就是依赖注入。常见的下降耦合的方式:bash
Dagger2 的原理是在编译期生成相应的依赖注入代码
。这也是和其余依赖注入框架不一样的地方,其余框架是在运行时期反射获取注解内容,影响了运行效率。框架
栗子ide
public class MainClass {
private void main(String [] args){
John john = new John("john",12);
john.introduceSelf();
}
}
复制代码
上面例子面临着一个问题,一旦 John
的建立方式(如构造参数)发生改变,那么你不但须要修改 MainClass
中建立John
的代码,还要修改其余全部地方建立 John
的代码。若是咱们使用了Dagger2
的话,就不须要管这些了,只须要在须要John
的地方写下:工具
@Inject
John john;
复制代码
PS:以上就是 Dagger2 学习前的基本概念的介绍,欢迎参考指正。post
参考文章