【问题标题】:Why scope annotations have RUNTIME retention in Dagger 2?为什么范围注释在 Dagger 2 中具有 RUNTIME 保留?
【发布时间】:2016-03-31 10:46:26
【问题描述】:

Dagger 2 具有编译时验证,那么为什么作用域注释具有 RUNTIME 保留?为什么在运行时需要它们?

【问题讨论】:

  • 除此之外,JSR 330 肯定没有考虑到 dagger,还有一些运行时依赖注入框架需要它们。

标签: dagger-2


【解决方案1】:

虽然我不确定,但我猜 Scopes 必然具有运行时保留,因为JSR 330's @Scope 要求作用域具有运行时保留。 (@Qualifier 具有相同的限制。)Dagger 1 和 Dagger 2 都宣传 JSR-330 兼容性,并且(正如 David 在 cmets 中提到的那样)有很多运行时依赖注入解决方案绝对需要运行时保留的范围注释.

特别是对于 Dagger,我无法想象为什么它们实际上会在运行时被读取,尽管我认为一些外部库可以使用注释。


从 cmets + Android multidex 警告编辑

这不一定是问题,无论是遗留问题还是其他问题:许多 DI 系统在运行时配置并需要注释。 Dagger 值得注意的是它没有,但规范的编写方式并没有允许运行时保留是可选的。这使应用程序开发人员可以将 Dagger 替换为 Guice 或 Spring 等不同的 JSR330 框架,并使库开发人员可以使 DI 兼容的工具或框架不知道它们是编译时配置的还是运行时配置的。这种规范的清晰性(即没有实现选项)和灵活性(编译时间或运行时)似乎值得保留不必要的注释的成本和学习成本。

但是,这可能在大型 Android 应用中是个问题,因为 Android keeps runtime-annotated classes in the main dex by default;如果带注释的类位于辅助 dex 中,旧版本的 Android 将无法加载运行时注释。有关详细信息,请参阅从 keepRuntimeAnnotatedClasses docs 链接的 this bug。尽管由于 Dagger 适用于大型 Android 应用程序,您可以将其视为 Dagger 问题,但它更多的是 Android 注释处理的错误,为此 Dagger 需要偏离 JSR-330 规范才能自行处理。

【讨论】:

  • 所以这就像遗留问题?它不会简化 Dagger 2 的使用学习。
  • 谢谢,你帮了很多忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
相关资源
最近更新 更多