【问题标题】:Guice - Binding an instance created by assisted injection factoryGuice - 绑定由辅助注入工厂创建的实例
【发布时间】:2016-11-09 17:40:27
【问题描述】:

假设有一个类 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 类)。

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

【问题讨论】:

    标签: java dependency-injection guice guice-3 assisted-inject


    【解决方案1】:

    您可以构建您的模块以使用 Providers(我在下面使用 @Provides 方法,但如果您愿意,您可以使用完整的 Provider 类或实例),并将一致的 A 标记为 @Singleton。如果想要 A 的两个绑定(一致的和不一致的),至少其中一个应该带有绑定注解;为方便起见,我在这里使用@Named,但您可以使用in the docs 中列出的任何绑定注释。

    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");
      }
    }
    

    【讨论】:

    • 所以如果我只在 E 类中有一个字段,如下所示:@Inject @Named("consistent")
    • @Inject @Named("consistent") A fieldName,但是是的。关键的“一致”可以是任何东西,只要你对此保持一致。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多