Guice:通过方法创建对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Guice:通过方法创建对象相关的知识,希望对你有一定的参考价值。

假设我有两个相似(但可能不同)的方法(或者可能是静态方法)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()是静态方法,并且如果它们是实例方法,我希望得到答案。如果它们是实例方法,则包含它们的类本身可能会受到依赖注入。

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

答案

来自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)的答案所述。

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

以上是关于Guice:通过方法创建对象的主要内容,如果未能解决你的问题,请参考以下文章

如何访问通过 guice 创建的 akka 系统?

TestNG 中使用 Guice 来进行依赖注入

Google Guice之作用域

Guice2.0的变化——第一部分 新的特性(上)

使用Dagger2做静态注入, 对比Guice.

guice的能力简述