Rookie
Rookie

Reputation: 5467

Guice: Using providers to get multiple instances:

I am trying to learn Guice for dependency Injection using Providers to create multiple instances of an object(Example from getting started guide on Guice website). how should I test this? Please advise.

The following is the module:

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);
  }
}

The following is the class under test:

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();

  }
}

The following is the test class with main():

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

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

        billingService.chargeOrder();   
      }
}

Upon running this, I am expecting the output from the following toString methods to show up but am seeing nothing:

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

What am i missing here?

Please advise,

thanks!

Upvotes: 0

Views: 1991

Answers (1)

Raffaele
Raffaele

Reputation: 20875

This happens because you just call toString without putting the resulting string anywhere (eg the call to System.out.println)

However providers are not intended to be used like that. You should not call Provider.get yourself: instead require the result of the provider, register your provider and let Guice do its job (you can also annotate methods in your modules with @Provides instead of defining provider classes)

By default providers are called each time a new instance of a certain class is required. Instances are not recycled unless you explicitly request it via using scopes (like the builtin Singleton)

Upvotes: 1

Related Questions