当前位置: 首页 > 知识库问答 >
问题:

Guice-绑定由辅助注入工厂创建的实例

松霖
2023-03-14

假设有一个类A,它的构造函数是这样的:

public A(@Assited long id, @Assisten String name, ServiceA serviceA, ServiceB serviceB)

还有AFactory:

public interface AFactory{

    A create(long id, String name);
}

所以要创建一个A的实例,我显然需要做这样的事情:

injector = Guice.createInjector(new MyModule());
AFactory af = injector.getInstance(AFactory .class);
A a = AFactory.create(100, "mike");

但是,假设我有其他类:例如,B类、C类和D类具有类型为A的成员(带有字段注入,但也可以是ctor):

    public class B{
       @Inject
       A a;
    }

我希望将 A 的相同实例注入到这些类中。但仍然可以选择将 A 的另一个实例注入其他类(假设 E 类和 F 类)。

正确的做法是什么?我就是想不出一个干净的方法来做到这一点。

共有1个答案

孟胤
2023-03-14

您可以构建模块以使用提供程序(我在下面使用@Provides方法,但如果您愿意,您可以使用完整的提供程序类或实例),并将一致的 A 标记为@Singleton。如果你想要 A 的两个绑定(一致和不一致),其中至少一个应该用绑定注释标记;出于方便,我在这里使用@Named,但您可以使用文档中列出的任何绑定注释。

public class AModule extends AbstractModule {
  @Override public void configure() {
    // Install your AFactory module. Here, injections for AFactory should succeed.
    install(new FactoryModuleBuilder().build(AFactory.class));
  }

  /**
   * Provides a singleton @Named("consistent") A.
   * Inject @Named("consistent") A into B, C, and D; Guice will cache the instance.
   */
  @Provides @Singleton @Named("consistent")
      A provideConsistentA(AFactory factory) {
    return factory.create(100, "mike");
  }

  /**
   * Provides an unscoped A.
   * Inject A without an annotation into E and F; each instance will be separate.
   */
  @Provides @Singleton A provideUnscopedA(AFactory factory) {
    return factory.create(200, "jeff");
  }
}
 类似资料:
  • 我一直在用guice做一个项目。 我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。 演示代码 我想知道的是,如果我可以用替换工厂,直接注入的实现(请注意,它们应该使用辅助注入)? 谢谢你。

  • 我是一名guice新手,试图弄清楚如何使用FactoryModuleBuilder在guice中实现辅助注入。我参考了guice java文档来实现FactoryModuleBuilder。 我所做的一切都完全按照文件中所说的那样。这不是注射工厂。我提到了这个堆栈溢出问题:Guice AssistedInject不会注入具有相同问题的工厂。它讨论了构造函数注入之前的字段注入问题。我遵循了它,并尝试

  • 目前,我将辅助注射与命名参数一起使用,如下所示: 这很棒。但是我认为使用字符串作为参数的标识符有点难看。我想做的是以下内容: 所以本质上我想要自定义辅助注释。有办法做到这一点吗?

  • 我有一个工厂是这样的: 这样的类: 如何正确使用Google Guice来做同样的事情?我尝试了辅助注射,但我不确定如何创建“UrlBuilder”。谁能帮忙?

  • 我希望能够通过辅助注入创建的对象来发现/注入创建对象的方法的名称。 我想做的一个例子: 不幸的是,到目前为止,我想到的实现这一点的唯一方法是 扩展辅助注射(通过复制和粘贴)以添加我的功能 写一些与辅助注射非常相似的东西,为我做这件事 写很多样板,在没有guices帮助的情况下做到这一点 我正在寻找一个解决方案,大致如下: < li >实现这一点的一些guice配置或模式 < li >实现此功能的一

  • 我有这个接口和简单的实现: 我想使用Guice用不同的方法生成一个。