本文系原创博客,文中不妥烦请指出,如需转载摘要请注明出处!

Dagger2的基本概念与实际应用

Alpha Dog

2016-11-30  10:00:00

本文Demo的github地址:https://github.com/DarkPointK/MyTestApplication.git

    最近2天看了几篇关于Dagger2的博文,一开始是云里雾里,后来尝试着动手才整理出思绪,恍然大悟。在Dagger2对于程序的解耦有了更深一层的认识!现在将自己的理解整理出来,希望能帮到正在学习的同志!

    想要在项目里应用Dagger2先从配置Gradle开始:

    1. 在项目级build.gradle的buildScript块中添加dependencies:  classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    2. 在app级的build.gradle中应用gradle插件:  apply plugin: 'com.neenbedankt.android-apt' ;添加dependencies:compile 'com.google.dagger:dagger:2.6'   apt 'com.google.dagger:dagger-compiler:2.6'

    至此,我们的资源就准备就绪了,对于还不了解Dagger2概念的读者我用一句话来概括下它的作用:Dagger2让我们得以利用注解的形式以任意初始化声明一些个对象,也就是说省去了new Object(); 这一个操作。下一步开始将Dagger2的Module与Component运用起来,在这里再解释一下这两个概念:首先Module字面意思是模块,它本质上是一个class类,里面存放着可以返回给Dagger2使用的对象实例的方法(可以理解为get()方法获取一个对象的操作);而Component则用于是装载Module的一个组件,它可以依赖或被其他Component依赖。接下来将给出个典型的例子跟明了的将这两个概念展现出来。

    想要了解Dagger2,就必须要知道依赖注入的基础和这其中的每一个概念:

该引用摘自 http://blog.csdn.net/wds1181977/article/details/51822043

  • @Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。

  • @Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。

  • @Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。

  • @Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的@Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。

  • @Scope: Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没 必要让每个对象都去了解如何管理他们的实例。在scope的例子中,我们用自定义的@PerActivity注解一个类,所以这个对象存活时间就和 activity的一样。简单来说就是我们可以定义所有范围的粒度(@PerFragment, @PerUser, 等等)。

  • Qualifier: 当类的类型不足以鉴别一个依赖的时候,我们就可以使用这个注解标示。例如:在Android中,我们会需要不同类型的context,所以我们就可以定义 qualifier注解“@ForApplication”和“@ForActivity”,这样当注入一个context的时候,我们就可以告诉 Dagger我们想要哪种类型的context。

这里我们定义了一个叫AppMod的Module,它有俩个构造方法,和一个叫getPoint的方法返回了一个Point对象。因为这个方法的存在,后续注入实例时,Dagger2便可以从这个方法获取。

这是一个非常简洁的Component,它实质是个接口,且只装载了一个Module,并定义了getPoint方法以暴露出去被其他Component依赖上。

这同样是个Component,与前面AppComponent不同的是,它依赖了一个Component(可以理解为继承了AppComponent)并拥有被依赖Component所暴露出的方法,在这里即是Point getPoint(); 。其中inject方法用于在后期使用时主动初始化该Component。另外上面使用到一个叫AppScope的注解,定义了对象的存活时间:

    不错,现在我们已经有了一个完善的Component可以被拿来使用了!在正式使用之前,还得先Rebuild Project一下项目,因为这样Dagger2才能根据我们写的Module和Component自动生成一些代码。Rebuild Project之后:

加载Component。使用Dagger+"自定义的Component名"来调用builder()方法并build。

最后,取得并调用Component的inject方法,并使用@Inject对对象进行注入。

    至此,基本的Dagger2的使用方法大家应该都掌握了,根据这一概念,我们可以将它花式运用起来,给Component装载各种Module,给各种对象进行注入,Dagger2在注入时都会自动的搜寻符合该对象的方法。

最新文章

  1. 游戏服java程序启动,显示内存溢出
  2. zend 汉化
  3. 读书笔记——Windows环境下32位汇编语言程序设计(3)求复数模的子程序
  4. 解决Win10默认占用80端口
  5. Tips for android
  6. [效果]JS折叠菜单-使用方法 (Moo.Fx)
  7. java对身份证验证及正则表达式解析
  8. ArrayList与LinkedList实现比较
  9. 如何用ATL创建ActiveX控件
  10. .net通用权限框架B/S (五)--WEB(2)登录
  11. 字符串拼接 拆分 NameValueCollection qscoll = HttpUtility.ParseQueryString(result)
  12. String的Intern方法详解
  13. openvpn实现内网 映射到 外网
  14. 虚拟机通信配置与Xshell连接
  15. MySQL binlog 日志
  16. Codeforces Round #485 (Div. 2)-B-High School: Become Human
  17. 000 Security的计划
  18. Socket网络编程--聊天程序(8)
  19. readv writev示例程序
  20. 【BZOJ2059】Buying Feed 购买饲料

热门文章

  1. Http协议规范及格式
  2. Ffmpeg简介
  3. Windows PE入门基础知识:Windows PE的作用、命名规则、启动方式、启动原理
  4. vector 遍历
  5. freemarker报错之四
  6. vue常用的网址
  7. 一个简单的freemark输入输出的案例(一)
  8. Aspose.Words for .NET
  9. ThinkCMF的跳转303 404等页面的方法
  10. Centos7.2 搭建Lamp服务器以及迁移WordPress个人博客详细过程