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

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在注入时都会自动的搜寻符合该对象的方法。

Dagger2的基本概念与实际应用。的更多相关文章

  1. 如何使用MVP+Dagger2+RxJava+Retrofit开发(1)

    概述 在2016年5,6月份开始在知乎上看到开发方法,那时候记得是看mvc,mvp,mvvm这三种开发模式区别,后面进一步了解到google在github上开源了使用这3种模式进行Android开发的 ...

  2. Dagger2 中的 Scope

    Dagger2 中虽然概念挺多的,但是大部分花时间都能理清.包括看人家的分析,Debug 代码下去也能懂.但是对于 scope 的用法以及实现原理还是有点难理解的.主要的问题也像简书上的文章所说: 自 ...

  3. Dagger2 (二) 进阶篇

    一.作用域Scope 之前了解RoboGuice的时候,我们知道它默认给我们提供了几个注解,ContextSingleton和Singleton,但是Dagger2更为灵活,只有javax包中提供的S ...

  4. 浅析Dagger2的使用

    什么是Dagger2 Dagger是为Android和Java平台提供的一个完全静态的,在编译时进行依赖注入的框架,原来是由Square公司维护,现在由Google维护. 我们知道Dagger是一个依 ...

  5. 解锁Dagger2使用姿势(一)

    毫无疑问,Dagger2的 上手是有门槛的,有门槛是因为它里边的概念多,用起来复杂,可是一旦你学会了Dagger2的使用,你一定会爱不释手的.与ButterKnife和AndroidAnnotatio ...

  6. Dagger2学习之由浅入深

    概述 Dagger2是一款使用在Java和Android上的静态的,运行时依赖注入框架.官方地址:http://google.github.io/dagger/ 记得当初刚学习Dagger2的时候看了 ...

  7. Dagger2学习笔记

    Dagger2是第一个使用生成代码的方式实现依赖注入的框架.作为Dagger的升级版本,自然有它的优势,优先注重的是执行效率.本文着重介绍Dagger2.官方据点传送门: https://google ...

  8. 使用Dagger2做静态注入, 对比Guice.

    Dagger 依赖注入的诉求, 这边就不重复描述了, 在上文Spring以及Guice的IOC文档中都有提及, 既然有了Guice, Google为啥还要搞个Dagger2出来重复造轮子呢? 因为使用 ...

  9. [Android] 转-RxJava+MVP+Retrofit+Dagger2+Okhttp大杂烩

    原文url: http://blog.iliyun.net/2016/11/20/%E6%A1%86%E6%9E%B6%E5%B0%81%E8%A3%85/ 这几年来android的网络请求技术层出不 ...

随机推荐

  1. 单片机:STC89C52的最小单元

    STC89C52RC是STC公司生产的一种低功耗.高性能CMOS8位微控制器,具有 8K字节系统可编程Flash存储器.STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51 ...

  2. JUnit4测试出错(一)

    log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUn ...

  3. cmder默认的命令提示符λ改成$

    新版的cmder(2016.11.3测试)单纯修改init.bat或以前的方法都试过了不行,下面是我自己找到的方法.亲测可行. cmder\vendor\clink.lua文件中第41行中{lamb} ...

  4. Linux下搭建SVN服务器遇到的问题及解决方法,

    1.checkout时,提示:URL svn://192.168.1.99/svntest doesn't exist... 奇怪,怎么会提示库不存在呢?肯定是哪里配置问题.后来尝试了半天,也在网上搜 ...

  5. R语言︱文本(字符串)处理与正则表达式

    处理文本是每一种计算机语言都应该具备的功能,但不是每一种语言都侧重于处理文本.R语言是统计的语言,处理文本不是它的强项,perl语言这方面的功能比R不知要强多少倍.幸运的是R语言的可扩展能力很强,DN ...

  6. 碎片︱R语言与深度学习

    笔者:受alphago影响,想看看深度学习,但是其在R语言中的应用包可谓少之又少,更多的是在matlab和python中或者是调用.整理一下目前我看到的R语言的材料: ---------------- ...

  7. E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)

    1 错误描述 youhaidong@youhaidong:~$ sudo apt-get update E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂 ...

  8. IOS开发之XCode学习007:UIWindow对象

    此文学习来源为:http://study.163.com/course/introduction/1002858003.htm #import "AppDelegate.h" @i ...

  9. 图片压缩上传Thumbnailator 插件

    一,接口已经写死 public static String upload(String appCode, MultipartFile inputFile) public static String u ...

  10. Directory Opus(DO) 个人使用经验 2.0

    设置已有命令的快捷键 设置方法 保存显示格式 保存方法 取消删除确认框 Windows取消删除确认框DO取消删除确认框 设置默认布局 设置方法 备份与恢复 设置已有命令的快捷键 已有命令指的是菜单栏上 ...