Guice:通过方法创建对象

时间:2017-12-15 20:10:10

标签: java class methods dependency-injection guice

假设我有两个相似(但不同)的方法(或者可能是静态方法)create_x()create_y()来创建对象(称之为xy)两者(类Parser的派生类。

现在我想绑定这两个方法创建的对象,如answer to my previous question中所示:

bind(Parser.class)
        .annotatedWith(Names.named("x"))
        .to(ParserXImplementation.class);

bind(Parser.class)
        .annotatedWith(Names.named("y"))
        .to(ParserYImplementation.class);

但由create_x()create_y()而不是类ParserXImplementationParserYImplementation的实例创建对象。 (因此没有必要创建类ParserXImplementationParserYImplementation。)

请注意,我希望对象是单例。

如果create_x()create_y()是静态方法,并且它们是实例方法,我希望得到答案。如果它们是实例方法,则包含它们的类本身可能会受到依赖注入。

怎么做? (将依赖项注入方法创建的实例)

1 个答案:

答案 0 :(得分:0)

来自https://github.com/google/guice/wiki/ProvidesMethods

当您需要代码来创建对象时,请使用@Provides方法。该方法必须在模块中定义,并且必须具有@Provides注释。方法的返回类型是绑定类型。只要注入器需要该类型的实例,它就会调用该方法。

public class BillingModule extends AbstractModule {
  @Override
  protected void configure() {
    ...
  }

  @Provides
  TransactionLog provideTransactionLog() {
    DatabaseTransactionLog transactionLog = new DatabaseTransactionLog();
    transactionLog.setJdbcUrl("jdbc:mysql://localhost/pizza");
    transactionLog.setThreadPoolSize(30);
    return transactionLog;
  }
}

此外,它表示可以使用@Named("x")@Named("y")等注释来区分xy,如Binding the same interface twice (Guice)的答案所述。< / p>

这就是我需要的(但是这个方法是在模块中而不是在任意类中定义的。)