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

匕首 2匕首 1 有什么优势?

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

  • Dagger 2 允许您使用带有 proguard 的代码混淆
  • Dagger 2更快(将其用于Android应用程序时,这不是一个很大的优势,但如果您将其用于某种服务器,这肯定是一件重要的事情)

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

还有其他优点/缺点吗?


答案 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。


答案 2

我不建议看牙

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


推荐