Java依赖注入:Dagger 1 vs Dagger 2,哪个更好?

时间:2015-07-11 08:11:53

标签: java android dependency-injection dagger dagger-2

Dagger 2优于Dagger 1的优势是什么?

到目前为止,我发现(只)2:

  • Dagger 2允许您使用代码混淆与proguard
  • Dagger 2速度更快(在Android应用程序中使用它时没什么优势,但如果你将它用于某种服务器,这肯定很重要)

与此同时,我发现了一个很大的缺点:你不能在Dagger 2中使用模块覆盖(@Module(overrides = true)),这至少对我来说很烦人 - 它对单元测试非常有用。

还有其他优点/缺点吗?

2 个答案:

答案 0 :(得分:18)

https://blog.gouline.net/2015/05/04/dagger-2-even-sharper-less-square/http://google.github.io/dagger/dagger-1-migration.html带来的一些优点和缺点:

Dagger 2的优点:

  • 没有更多的反思 - 一切都是作为具体的电话完成的(ProGuard完全没有配置)
  • 不再有运行时图形组合 - 提高性能,包括每个请求案例
  • 可跟踪 - 更好的生成代码和无反射有助于使代码可读且易于理解
  • 除了字段和构造函数注入之外还支持方法注入,这是Dagger 1支持的唯一两种类型
  • 模块需要的配置少于Dagger 1
  • 允许用户使用任何格式正确的范围注释。 Dagger 1仅支持单个范围:@Singleton

缺点:

  • inject()方法现在与注射目标具有强类型关联。这对调试很有用,但它使从基类注入的常见做法变得复杂(例如基本活动,片段等)。
  • 组件实现需要重建要显示的项目,并且任何与注入相关的编译错误都会导致类消失(即未生成)。
  • 不支持overrides。覆盖简单测试假货的模块可以创建模块的子类来模拟该行为。应该分解使用覆盖并依赖依赖注入的模块,以便将覆盖模块表示为两个模块之间的选择。

编辑2016/11/16:这不是技术优势,但Dagger 1现已弃用(截至2016年9月15日),不再积极开发。他们建议迁移到Dagger 2。

答案 1 :(得分:2)

我不建议您查看toothpick

作为合着者,我显然有偏见,但是这个使用起来要简单得多,至少在大多数情况下都比匕首快。实际上,范围树是开发更多高级功能的非常强大的方法,例如在多个活动范围内回收实例。