11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

Dagger: 一种 Android 平台的依赖注入框架

  • 2012-10-31
  • 本文字数:1386 字

    阅读完需:约 5 分钟

Square 是一家专注于移动支付的公司,最近它推出了一种叫做 Dagger 的新库,并将其描述为“一种针对 Android 和 Java 的快速依赖注入器”,该库的源码已经发布在 GitHub 上。

依赖注入(也叫做控制反转)已在一些流行的框架中(如 Spring Google Guice )占有重要的位置。然而这些框架仅仅是针对标准 JVM 而设计的,并不支持诸如 Android 之类的移动环境。当 RoboGuice 正尝试提升 Guice 在 Android 的体验之时,Dagger 通过专注于一种简化的功能集以一种不同的方式达到了更好的性能。

在本文写作时,Dagger 已支持以下功能:

  • 使用 JSR-330 标准注解进行构造器注入
  • 使用 @Provides 注解创建对象
  • 针对依赖树的中心上下文
  • 昂贵资源延迟注入
  • 同一接口的多种实现
  • 静态注入 (针对遗留环境)
  • 绑定的编译时验证

相对 Spring 和 Guice 来说,Dagger 针对标准注入注解只有最基本级别的支持。在Dagger 中仅支持构造器的注入,而你无法进行方法注入(向类中进行依赖注入的另一种方式)。Dagger 同样提供了@Provides 注解,其工作方式类似于Guice。

一旦定义了依赖,你可以通过保存着整棵Dagger 初始化对象树的ObjectGraph (对象图谱)来获取那些已被解析的类。它的工作原理类似于Spring 的 ApplicationContext 和Guice 的 Injector 。Dagger 同样也沿用了在Guice 中的模块概念(一系列绑定)。

如果以一种迫切的方式创建一些像连接池那样的依赖,会付出相当昂贵的代价。在这种情况下,Dagger 支持对这些依赖延迟初始化,而语法也与Guice 相似。还有一种情况是对于同一接口会有多种实现并存,Dagger 允许你使用@Named 注解进行区分。

最后Dagger 可以继续使用Factories 来取代依赖注入以提供遗留代码的注入。同样的,这种功能的方式与语法与Google Guice 相似。

就目前来看,Dagger 支持的功能仅是Google Guice 的子集。考虑到这两个框架的负责人员存在重叠,所以这是可以理解的。然而,Dagger 拥有更小型的配置,并且非常明确是针对Android 开发的,而它最明显的不足是缺少对于方法和字段的注入支持。

Dagger 牺牲了这项功能却提升了错误检查及探测方面的能力。通常依赖注入错误要等到应用开始运行期间才能得到运行时报告。Dagger 却包含了注解的编译时检查,对于不完整的绑定会触发编译错误。这个功能将使得在 Android 上的应用开发变得更加轻松。

另一项较大的不同之处是,相比于其他流行的框架,Dagger 对范围只有的较少的支持。Dagger 仅支持 @Singleton 注解而没有其他范围了。同样这也是可以预料的,因为 Android 开发的需求有别于标准的 Web 开发(Web 开发伴随着请求和会话的范围)。

值得一提的是 Spring 用户不仅注意到了 Dagger,同时作为 Spring 相比于 Dagger 的不足之处,创建了两个关于 Spring 的问题报告. 第一个是 Spring 仅能注入本身含有注解的类,而第二个是 Spring 无法区分通过泛型实现同一接口的类

目前 Dagger 唯一的有效文档是 README ,其代码基于 Apache2 许可开源。注意到该项目尚未有正式的发布版(甚至没有一个源代码的标签),所以当你在评估是否将 Dagger 用于生产部署时也许需要慎重考虑。

英文原文链接 Dagger: A Dependency Injection Framework For Android


感谢侯伯薇对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-10-31 03:4313769
用户头像

发布了 52 篇内容, 共 21.2 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

我用 Python 找出了删除我微信的所有人并将他们自动化删除了

Python小二

Python 微信

fastJson与一起堆内存溢出'血案'

AI乔治

Java 架构 JVM Fastjson 内存溢出

《Web应用安全权威指南》.pdf

田维常

如何正确的关闭线程池

Rayjun

Java 线程池

作业-第4周

arcyao

架构师训练营第 8 周作业

netspecial

极客大学架构师训练营

JVM真香系列:图解垃圾回收器

田维常

JVM 垃圾回收

ARTS Week14

丽子

架构师训练营第1期 - week08 - 作业

lucian

极客大学架构师训练营

C++的智能指针你了解吗?

良知犹存

c++

Flutter 开发从 0 到 1(二)框架与网络

吴小龙同学

flutter ios android 跨平台

在线IDE开发入门之从零实现一个在线代码编辑器

徐小夕

Java ide H5 H5制作 代码编辑器

python+requests进行get、post方法接口测试

测试人生路

Python 接口测试

作业-第4周总结

arcyao

架构师训练营 - 第四周课后练习

joshuamai

架构师训练营 - 第四周学习总结

joshuamai

你以为只是简单的排序?(一)

书旅

数据结构与算法 Go 语言

【薪火计划】01 - 好与坏

dstweihao

管理

用eBPF/bcc分析系统性能的一个简单案例

AI乔治

Java 编程 架构 大前端

Flutter 开发从 0 到 1(一)需求与准备

吴小龙同学

flutter ios android 跨平台

第八章作业

alpha

极客大学架构师训练营

极客大学架构师训练营第一期第八周总结

睡不着摇一摇

架构师一期

大招落地:MySQL 插入更新死锁源码分析

AI乔治

Java MySQL 编程 架构

java是如何调用native方法?hotspot源码分析必会技能

诸葛小猿

Java jdk JVM jni hotspot

极客时间 - 架构师一期 - 第八周作业

_

极客大学架构师训练营 第八周作业

目标检测-darknet 之模型初始化

Dreamer

面试官最常用小心思:说说你的项目并发量多大?负载均衡怎么做?

小Q

Java Linux 学习 面试 并发

架构师训练营第 8 周学习总结

netspecial

极客大学架构师训练营

架构师训练营第 1 期 - 第 8 周课后练习

Anyou Liu

极客大学架构师训练营

极客大学 - 架构师培训 -ch3 作业

bing5tui3

极客大学架构师训练营

基于f2从零实现移动端可视化编辑器

徐小夕

Java H5 数据可视化 h5编辑器 H5制作

Dagger: 一种Android平台的依赖注入框架_Java_Kostis Kapelonis_InfoQ精选文章