目标

了解 Dagger 基本概念

官方定义

Google 对 Dagger 的定义如下:

Dagger is a fully static, compile-time dependency injection framework for both Java and Android. It is an adaptation of an earlier version created by Square and now maintained by Google.

Dagger 是一个为 Java 和 Android 设计的完全静态,编译时依赖注入框架。现在由 Google 维护,它对 Square 开发的早期版本进行了改写。

什么是编译时依赖呢?就是不在运行时依赖,额...Dagger 会通过注解,生成代码,而这个代码跟我们手动写的依赖注入的代码一样。

如果你对『依赖注入』不了解,请看[这篇文章]()(未填的坑)。

Dagger1.x已经废弃,我们以后所说的Dagger就是Dagger2.x。

Dagger 基本概念

Dagger 使用了注解,我们先来最基本的注解的用法。

声明依赖 @Inject

Dagger 使用注解 javax.inject.Inject 来修饰一个类的构造函数,然后就 Dagger 就可以管理它了。当 Dagger 需要 该类的实例时,就会调用这个构造函数来构造它,也会自动实例化该构造函数的参数所需要的实例。

@Inject 也可以修饰一个类的属性,在构造这个类时,Dagger 会将这个属性所需要的对象实例化出来。但是要注意,这个属性的类型构造函数需要注入即也用 @Inject 修饰。

@Inject 还可以修饰一个方法,这样在构造实例后,会立刻调用该方法。并不推荐这样做,因为这就是初始化的工作嘛,都可以在构造函数里做。

class Thermosiphon implements Pump {private final Heater heater;@InjectThermosiphon(Heater heater) {this.heater = heater;}...
}class CoffeeMaker {@Inject Heater heater;@Inject Pump pump;...
}

但是 @Inject 有他的局限性

  1. 接口不能注入,它没有构造函数。而一个好的设计是面向接口编程
  2. 第三方类库的类,我们不能修改,没法给它加 @Inject
  3. 我们需要的对象可能需要配置,而且每次需要的配置可能还不同

满足依赖 @Provides

以上 @Inject 的问题都可以通过 @Provides 来解决。 @Provides 修饰一个方法,这个方法会提供一个对象,在方法里我们自己实现如何实例化一个对象,如何配置。这个方法也可以有参数,同 @Inject 修饰的构造函数,参数会被注入。

但是,@Inject 修饰的方法只能是一个 Module 的方法可以是静态的或者非静态的。而这个 Module 实际只是一个由 @Module 修饰的普通的类。

约定,@Provides 修饰的方法命名以 provide 开头,@Module 修饰的类以 Module 结尾。

@Module
class DripCoffeeModule {
@Provides static Heater provideHeater() {
return new ElectricHeater();
}

@Provides static Pump providePump(Thermosiphon pump) {
return pump;
}
}

构建对象图

@Inject 和 @Provides 修饰的类组成了一个对象图,而其中的元素因依赖而连接。而应用的入口点,就需要拿到这个图的一个根的集合(这牵扯到数据结构了,数据结构里的树有一个根,而图可以有多个根,从这个根,连接到一系列节点构成一颗树)。Dagger 通过 Component 提供这个图的根的集合。只有拿到 Component, Dagger 才能按照约定构造所有依赖的实例。

Component 是一个 @Component 修饰的接口,它定义一系列无参数方法,返回需要的类型。Dagger 会生成它的实现类,该类命名是在接口名前加 Dagger(如果你是用的Android Studio,要点编译按钮后才会生成实现类)。

@Component 注解还可以传一个参数,modules,即该 Component 所依赖的 Module

@Component(modules = DripCoffeeModule.class)
interface CoffeeShop {CoffeeMaker maker();
}

在应用的入口点,通过 Component 的 builder 构造 Component 的实例,需要手动创建一个 Module 的实例。

CoffeeShop coffeeShop = DaggerCoffeeShop.builder().dripCoffeeModule(new DripCoffeeModule()).build();

总结

我们一块学习了 Dagger 中最基本的概念:

  1. @Inject 声明依赖
  2. @Provides 我们自定义如何提供一个实例
  3. @Module 修饰一个类,它内部可以定义多个 @Provides 修饰的方法
  4. @Component 修饰一个接口,它定义了依赖形成的图的一系列根。启动这个构造系统的×××。

本文主要参考了,Dagger 官方文档。

转载于:https://blog.51cto.com/13616847/2073734

Dagger学习 -- 基础概念相关推荐

  1. 深度学习入门——深度学习基础概念思维导图

    深度学习基础概念的思维导图,思维导图又叫心智导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具.思维导图运用图文并重的技巧,把各级主题的关系用相互隶属与相关的层级图表 ...

  2. 强化学习——基础概念

    强化学习--基础概念 一.强化学习问题的提出 奖励 Reward 环境 Environment 状态 State 二.智能体 Agent 策略 Policy 价值函数 Value function 模 ...

  3. 【强化学习】从强化学习基础概念开始

    在开始探索强化学习的诸多算法之前,我们先来了解一下它所涉及到的具体概念.这些概念将作为基石,一直陪伴着我们的学习之旅.为了能够将这些概念熟记在心,我们这一期做成强化学习概念小卡片,一张一张给大家展示和 ...

  4. PixiJS学习 基础概念

    介绍 简介 Pixi是一款速度极快的2D Sprite渲染引擎.那是什么意思?这意味着它可以帮助您显示,制作和管理交互式图形,以便使用JavaScript和其他HTML5技术轻松制作动画,游戏和一些其 ...

  5. 深度学习——深度学习基础概念

    摘要 本文将针对与深度学习的平台的这样的一个理解和实战这样的一个理解.这是一个系列的课程.我将一直更新有关于的paddle的开发和学习.Paddle包括众多方面.目标检测.文字识别.图像分类.图像分割 ...

  6. qml基础学习 基础概念

    一.概括 学习qt已有2年多的时间,从qt4.7开始使用直到现在正在使用的qt5.6,基本都在windows机器上做开发.最近有意向看了下qt的qml部分,觉着还是挺不错的,毕竟可以做嵌入式移动端产品 ...

  7. WCF学习- 基础概念

    Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架.借助 WCF,可以将数据作为异步消息从一个服务终结点发送至另一个服务终结点.服务终结点 ...

  8. 机器学习与深度学习基础概念介绍

    主要术语(基本) 主要包括标签.特征.样本.训练.模型.回归模型.分类模型.泛化.过拟合.预测.平稳性.训练集.验证集.测试集. 标签(label) 标签是我们要预测的事物,在分类任务中的类别,比如是 ...

  9. 迁移学习---迁移学习基础概念、分类

    迁移学习提出背景 在机器学习.深度学习和数据挖掘的大多数任务中,我们都会假设training和inference时,采用的数据服从相同的分布(distribution).来源于相同的特征空间(feat ...

最新文章

  1. linux进入节点权限,一种基于索引节点的Linux访问权限控制方法与流程
  2. 追MM与Java的23种设计模式
  3. c语言解析json数据
  4. Android6 0权限机制(一):介绍
  5. windows7中安装jdk1.8
  6. Python hashlib、hmac模块
  7. php开发经典问题,PHP开发常见问题集锦(一)
  8. uvalive3983Robtruck
  9. 【转】粒子滤波简介以及相关技术探讨
  10. 【ClearCase 学习笔记 】之(1/4)CC四大功能概述
  11. RealSense D435i深度相机介绍
  12. 三季度国内光伏市场需求仍将强劲
  13. 逆转录转座子简单介绍
  14. 车牌号归属地查询,免费API
  15. Java 汽车租赁管理系统
  16. sql server数据修复语句
  17. 【手把手教安装】VM16 Pro安装Win10!!!
  18. Python字典视图浅析
  19. Box2D 源码编译
  20. 计算机内部为什么采用二进制表示数据,计算机内部为什么使用二进制处理数据? - 问答库...

热门文章

  1. mysql 时间转时间戳
  2. 小米即将推出OLED电视,冲击行业老大创维
  3. AI达人特训营]印度vs津巴布韦!板球比赛语义分割
  4. 【天线专题】天线(Antenna)的理解
  5. 记录学习(转载) STM32---程序如何在内部运行寄存器编程的理解
  6. 西米支付:数字藏品支付通道,数字藏品对接支付接口相关知识(供参考)
  7. LayaAir 2.0 正式版发布了,重要特性全面介绍
  8. 双向链表和循环双向链表的基本操作
  9. 蜗牛学院:《王者荣耀》的浪潮正渐平静,“吃鸡”战场的枪声,则悄然打响...
  10. phpspider php爬虫框架