我正在尝试使用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();
我在这里缺少什么?
请指教,
谢谢!
答案 0 :(得分:1)
这是因为你只是调用toString而不将结果字符串放在任何地方(例如调用System.out.println)
但是,提供商不应该像这样使用。您不应该自己调用Provider.get:而是需要提供者的结果,注册您的提供者并让Guice完成它的工作(您也可以使用@Provides而不是定义提供者类来注释模块中的方法)
默认情况下,每次需要某个类的新实例时都会调用提供程序。除非您通过使用范围(如内置单例)
明确请求实例,否则不会回收实例