Guice:通过方法创建对象

问题描述 投票:1回答:1

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

现在我想绑定由这两个方法创建的对象,如在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()是静态方法,并且如果它们是实例方法,我希望得到答案。如果它们是实例方法,则包含它们的类本身可能会受到依赖注入。

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

java class methods dependency-injection guice
1个回答
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)的答案所述。

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

© www.soinside.com 2019 - 2024. All rights reserved.