绑定一个由辅助注入工厂创建的实例



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

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

还有工厂:

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的成员(有字段注入,但也可以是tor):

    public class B{
       @Inject
       A a;
    }
我希望A的相同的实例将被注入到这些类中。但是仍然可以选择将A的另一个实例注入到其他类(假设是类E和类F)。

做那件事的正确方法是什么?

你可以构造你的模块来使用Providers(我在下面使用@ Providers方法,但是如果你愿意,你可以使用完整的Provider类或实例),并将一致的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");
  }
}

相关内容

  • 没有找到相关文章

最新更新