【问题标题】:Java dependency injection: Dagger 1 vs Dagger 2, which is better?Java 依赖注入:Dagger 1 与 Dagger 2,哪个更好?
【发布时间】:2015-07-11 08:11:53
【问题描述】:

Dagger 2 相对于Dagger 1 有什么优势?

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

  • Dagger 2 允许您通过 proguard 使用代码混淆
  • Dagger 2 速度更快(在将它用于 android 应用程序时这并不是什么优势,但如果将它用于某种服务器,这肯定是一件很重要的事情)

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

还有其他优点/缺点吗?

【问题讨论】:

  • 不要询问:产品或服务推荐或比较
  • 你在这里问了一个类似的问题:stackoverflow.com/questions/31354735/…。我认为这篇文章应该是对那篇文章的编辑,
  • @Selvin 这样的问题有时对社区很有价值,因为它们会引起人们对“选择哪个 Dagger DI 以及为什么选择?”等常见问题的关注。很抱歉违反了您引用的规则,但也有“允许一些主观问题”,“所有主观问题都应该是建设性的”。如果您的评论获得的票数多于当前评论 - 我将删除该问题。
  • @DerGol...lum 另一个问题是关于相当具体的技术问题。当前的一个更多是关于获得详尽的优势/问题列表,以便人们可以自己决定选择哪种匕首。如果问题被证明会引发毫无意义的讨论或激怒,我将删除该问题...
  • 嗯,我完全同意@Selvin 的评论。但这可能是对您之前帖子的编辑,使该帖子更丰富且重复数据删除。

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


【解决方案1】:

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

匕首2的优势:

  • 不再需要反射 - 一切都作为具体调用完成(ProGuard 无需任何配置即可工作)
  • 不再有运行时图组合 - 提高性能,包括每个请求的情况
  • 可追溯 - 更好的生成代码和无反射有助于使代码易于阅读和理解
  • 除了 Dagger 1 仅支持的两种类型的字段和构造函数注入之外,还支持方法注入
  • 与 Dagger 1 相比,模块需要更少的配置
  • 允许用户使用任何格式良好的范围注释。 Dagger 1 仅支持单个作用域:@Singleton

以及缺点:

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

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

【讨论】:

  • 我再也找不到信息的来源了,但是 D2 应该比 D1 快 17%..
【解决方案2】:

我不建议您查看toothpick

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

【讨论】:

  • 你不会?好吧,我会推荐 Toothpick - 我使用 Dagger 2 的次数更多,但这个库还没有给我带来任何麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多