1

假设有一个类 A 的构造函数看起来像这样:

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

还有AFactory:

public interface AFactory{

    A create(long id, String name);
}

因此,要创建一个 AI 实例显然需要执行以下操作:

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 类)。

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

4

1 回答 1

1

您可以构建您的模块以使用 Providers(我在下面使用@Provides方法,但如果您愿意,您可以使用完整的 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");
  }
}
于 2016-11-09T23:11:53.090 回答