Guice:使用提供程序获取多个实例:

时间:2015-05-10 15:59:01

标签: java dependency-injection guice

我正在尝试使用Providers学习Guice for dependency Injection来创建一个对象的多个实例(Guice网站上的入门指南示例)。我该怎么测试呢?请指教。

以下是模块:

package testing;

import com.google.inject.AbstractModule;

public class BillingModule extends AbstractModule {
     @Override 
     protected void configure() {
    bind(TransactionLog.class).to(DatabaseTransactionLog.class);
    bind(BillingService.class).to(RealBillingService.class);
    bind(CreditCardProcessor.class).to(PaypalCreditCardProcessor.class);
  }
}

以下是受测试的课程:

package testing;
import com.google.inject.Inject;
import com.google.inject.Provider;

public class RealBillingService implements BillingService {
  private  Provider<CreditCardProcessor> processorProvider;
  private  Provider<TransactionLog> transactionLogProvider;

  @Inject
  public RealBillingService(Provider<CreditCardProcessor> processorProvider,
      Provider<TransactionLog> transactionLogProvider) {
    this.processorProvider = processorProvider;
    this.transactionLogProvider = transactionLogProvider;
  }

  public void chargeOrder() {
    CreditCardProcessor processor = processorProvider.get();
    TransactionLog transactionLog = transactionLogProvider.get();

    /* use the processor and transaction log here */
    processor.toString();
    transactionLog.toString();

  }
}

以下是带main()的测试类:

public class test {
public static void main(String[] args) {

        Injector injector = Guice.createInjector(new BillingModule());
        BillingService billingService = injector.getInstance(BillingService.class);

        billingService.chargeOrder();   
      }
}

运行它时,我希望以下toString方法的输出显示但看不到任何内容:

    processor.toString();
    transactionLog.toString();

我在这里缺少什么?

请指教,

谢谢!

1 个答案:

答案 0 :(得分:1)

这是因为你只是调用toString而不将结果字符串放在任何地方(例如调用System.out.println)

但是,提供商不应该像这样使用。您不应该自己调用Provider.get:而是需要提供者的结果,注册您的提供者并让Guice完成它的工作(您也可以使用@Provides而不是定义提供者类来注释模块中的方法)

默认情况下,每次需要某个类的新实例时都会调用提供程序。除非您通过使用范围(如内置单例)

明确请求实例,否则不会回收实例