Dagger2的基本概念与实际应用。
本文系原创博客,文中不妥烦请指出,如需转载摘要请注明出处!
Dagger2的基本概念与实际应用
Alpha Dog
2016-11-30 10:00:00
本文Demo的github地址:https://github.com/DarkPointK/MyTestApplication.git
最近2天看了几篇关于Dagger2的博文,一开始是云里雾里,后来尝试着动手才整理出思绪,恍然大悟。在Dagger2对于程序的解耦有了更深一层的认识!现在将自己的理解整理出来,希望能帮到正在学习的同志!
想要在项目里应用Dagger2先从配置Gradle开始:
- 在项目级build.gradle的buildScript块中添加dependencies: classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
- 在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的基本概念与实际应用。的更多相关文章
- 如何使用MVP+Dagger2+RxJava+Retrofit开发(1)
概述 在2016年5,6月份开始在知乎上看到开发方法,那时候记得是看mvc,mvp,mvvm这三种开发模式区别,后面进一步了解到google在github上开源了使用这3种模式进行Android开发的 ...
- Dagger2 中的 Scope
Dagger2 中虽然概念挺多的,但是大部分花时间都能理清.包括看人家的分析,Debug 代码下去也能懂.但是对于 scope 的用法以及实现原理还是有点难理解的.主要的问题也像简书上的文章所说: 自 ...
- Dagger2 (二) 进阶篇
一.作用域Scope 之前了解RoboGuice的时候,我们知道它默认给我们提供了几个注解,ContextSingleton和Singleton,但是Dagger2更为灵活,只有javax包中提供的S ...
- 浅析Dagger2的使用
什么是Dagger2 Dagger是为Android和Java平台提供的一个完全静态的,在编译时进行依赖注入的框架,原来是由Square公司维护,现在由Google维护. 我们知道Dagger是一个依 ...
- 解锁Dagger2使用姿势(一)
毫无疑问,Dagger2的 上手是有门槛的,有门槛是因为它里边的概念多,用起来复杂,可是一旦你学会了Dagger2的使用,你一定会爱不释手的.与ButterKnife和AndroidAnnotatio ...
- Dagger2学习之由浅入深
概述 Dagger2是一款使用在Java和Android上的静态的,运行时依赖注入框架.官方地址:http://google.github.io/dagger/ 记得当初刚学习Dagger2的时候看了 ...
- Dagger2学习笔记
Dagger2是第一个使用生成代码的方式实现依赖注入的框架.作为Dagger的升级版本,自然有它的优势,优先注重的是执行效率.本文着重介绍Dagger2.官方据点传送门: https://google ...
- 使用Dagger2做静态注入, 对比Guice.
Dagger 依赖注入的诉求, 这边就不重复描述了, 在上文Spring以及Guice的IOC文档中都有提及, 既然有了Guice, Google为啥还要搞个Dagger2出来重复造轮子呢? 因为使用 ...
- [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的网络请求技术层出不 ...
随机推荐
- 单片机:STC89C52的最小单元
STC89C52RC是STC公司生产的一种低功耗.高性能CMOS8位微控制器,具有 8K字节系统可编程Flash存储器.STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51 ...
- JUnit4测试出错(一)
log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUn ...
- cmder默认的命令提示符λ改成$
新版的cmder(2016.11.3测试)单纯修改init.bat或以前的方法都试过了不行,下面是我自己找到的方法.亲测可行. cmder\vendor\clink.lua文件中第41行中{lamb} ...
- Linux下搭建SVN服务器遇到的问题及解决方法,
1.checkout时,提示:URL svn://192.168.1.99/svntest doesn't exist... 奇怪,怎么会提示库不存在呢?肯定是哪里配置问题.后来尝试了半天,也在网上搜 ...
- R语言︱文本(字符串)处理与正则表达式
处理文本是每一种计算机语言都应该具备的功能,但不是每一种语言都侧重于处理文本.R语言是统计的语言,处理文本不是它的强项,perl语言这方面的功能比R不知要强多少倍.幸运的是R语言的可扩展能力很强,DN ...
- 碎片︱R语言与深度学习
笔者:受alphago影响,想看看深度学习,但是其在R语言中的应用包可谓少之又少,更多的是在matlab和python中或者是调用.整理一下目前我看到的R语言的材料: ---------------- ...
- E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)
1 错误描述 youhaidong@youhaidong:~$ sudo apt-get update E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂 ...
- IOS开发之XCode学习007:UIWindow对象
此文学习来源为:http://study.163.com/course/introduction/1002858003.htm #import "AppDelegate.h" @i ...
- 图片压缩上传Thumbnailator 插件
一,接口已经写死 public static String upload(String appCode, MultipartFile inputFile) public static String u ...
- Directory Opus(DO) 个人使用经验 2.0
设置已有命令的快捷键 设置方法 保存显示格式 保存方法 取消删除确认框 Windows取消删除确认框DO取消删除确认框 设置默认布局 设置方法 备份与恢复 设置已有命令的快捷键 已有命令指的是菜单栏上 ...