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

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. iOS.Animations.by.Tutorials.v2.0汉化(二)

    翻译自:iOS.Animations.by.Tutorials.v2.0 第一节(第1章) 动画属性 现在你已经看到了动画是多么的简单,你可能很想知道你的视图控件是怎么动起来的.本节将给你一个UIVi ...

  2. Python-ORM之sqlalchemy的简单使用

    ORM之sqlalchemy 基础章节 使用SQLAlchemy链接数据库 from sqlalchemy import create_engine from sqlalchemy.ext.decla ...

  3. Android安全开发之WebView中的大坑

    0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等.WebView功能强大 ...

  4. 工作中常用的linux命令(1)

    1.cd :进入一个目录,例如进入/home/admin目录:cd /home/admin 2.pwd :查看当前所在目录:如图: 3.ls :列出当前目录下的所有文件: 4.ll :列出当前目录下的 ...

  5. 理解Annotation

    一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关 ...

  6. 获取JSON对象的属性值

    1.问题背景 有一个json对象,其中有键值对,那怎样获取json对象中属性值 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  7. ubuntu14.04 64位 安装eclipse

    ubuntu14.04 64位 安装eclipse 1 在官网上下载eclipse http://www.eclipse.org/downloads/下载eclipse-jee-luna-SR1-li ...

  8. java 后台封装json数据学习总结(一)

    一.数据封装 1. List集合转换成json代码 List list = new ArrayList(); list.add( "first" ); list.add( &quo ...

  9. 由js深拷贝引起的对内存空间的一些思考

    数据类型 js常用数据类型分为基本类型和引用类型 基本类型:null.undefined.数值型.字符串型.布尔型 引用类型:数组.对象 内存空间 var a = [1, 2, 3]; var b = ...

  10. CSS3动画效果示例

    CSS3动画遵循@kwyframes规则,规定了动画的名称.时长. 1.示例代码 <!DOCTYPE html><html lang="en"><he ...