java - 我可以使用 Dagger 的某种辅助注入(inject)吗?

标签 java guice dagger gwt-gin dagger-2

使用 Google Guice 或 Gin,我可以指定不受依赖注入(inject)框架控制的参数:

class SomeEditor {


  @Inject
  public SomeEditor(SomeClassA a, @Assisted("stage") SomeClassB b) {
  }

}

辅助参数 stage 在创建 SomeEditor 实例时指定。

SomeClassA 的实例取自对象图,SomeClassB 的实例取自运行时的调用者。

在 Dagger 中有类似的方法吗?

最佳答案

更新:截至Dagger 2.31从 2021 年 1 月开始,现在使用 Dagger natively supports assisted injection ,即 recommended over the Square and Auto options . (那些其他选项仍然有效,但与 native 选项相比可能需要额外设置。)

class SomeEditor {
  @AssistedInject public SomeEditor(
      SomeClassA a, @Assisted SomeClassB b) {
    // ...
  }
}

@AssistedFactory interface SomeEditorFactory {
  SomeEditor create(SomeClassB b);
}

(原始答案)

因为工厂是一种需要优化的独立样板文件类型 (see mailing list discussion here),Dagger 将它留给了一个姊妹项目,AutoFactory .这提供了 Guice 通过 assisted injection 提供的“FactoryModuleBuilder ”功能,但有一些额外的好处:

  • 您可以继续将 AutoFactory 与 Guice 或 Dagger 或任何其他 JSR-330 依赖项注入(inject)框架一起使用,因此即使您在它们之间切换,也可以继续使用 AutoFactory。
  • 因为 AutoFactory 生成代码,所以您不需要编写接口(interface)来表示构造函数:AutoFactory 会编写一个全新的类型供您编译。 (如果您愿意,或者如果您要从 Guice 迁移,您也可以指定要实现的接口(interface)。)
  • 因为所有类型检查都发生在编译时,它会生成普通的旧 Java,不会因反射而导致任何缓慢,并且可以很好地与调试器和优化器配合使用。这使得 Auto 库对 Android 开发特别有用。

示例,从 AutoFactory 的自述文件中提取,它将生成一个 SomeClassFactory,在一个 @Inject 注释的构造函数和 depB 中使用 providedDepA create 方法中:

@AutoFactory
final class SomeClass {
  private final String providedDepA;
  private final String depB;

  SomeClass(@Provided @AQualifier String providedDepA, String depB) {
    this.providedDepA = providedDepA;
    this.depB = depB;
  }

  // …
}

关于java - 我可以使用 Dagger 的某种辅助注入(inject)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29175014/

相关文章:

java - Java 中的反向 HashMap 键和值

java - 使用递归来反转整数而不使用字符串

java - 如何将条形图放置在刻度线之间?

jax-rs - Resteasy 和 Google Guice : how to use multiple @ApplicationPath and resource with @Injection?

java - JAX-RS 子资源和 Guice 注入(inject)

java - Java 中是否有保留的包名称?

Hadoop 作业 : Error injecting constructor, JAXBException

android-studio - 如何使用 Dagger2 android 为 ViewModel 使用构造函数注入(inject)?

java - 错误: [Dagger/MissingBinding] error message doesn't make sense

android - 无法在 attachBaseContext() 中使用 Dagger 注入(inject)对象来更新语言环境