- 
                Notifications
    
You must be signed in to change notification settings  - Fork 1.7k
 
ProviderBindings
When your @Provides methods start to grow complex, you may consider moving
them to a class of their own. The provider class implements Guice's Provider
interface, which is a simple, general interface for supplying values:
public interface Provider<T> {
  T get();
}Our provider implementation class has dependencies of its own, which it receives
via its @Inject-annotated constructor. It implements the Provider interface
to define what's returned with complete type safety:
public class DatabaseTransactionLogProvider implements Provider<TransactionLog> {
  private final Connection connection;
  @Inject
  public DatabaseTransactionLogProvider(Connection connection) {
    this.connection = connection;
  }
  public TransactionLog get() {
    DatabaseTransactionLog transactionLog = new DatabaseTransactionLog();
    transactionLog.setConnection(connection);
    return transactionLog;
  }
}Finally we bind to the provider using the .toProvider clause:
public class BillingModule extends AbstractModule {
  @Override
  protected void configure() {
    bind(TransactionLog.class)
        .toProvider(DatabaseTransactionLogProvider.class);
  }
}If your providers are complex, be sure to test them!
Guice does not allow exceptions to be thrown from Providers. The Provider
interface does not allow for checked exception to be thrown. RuntimeExceptions
may be wrapped in a ProvisionException or CreationException and may prevent
your Injector from being created. If you need to throw an exception for some
reason, you may want to use the
ThrowingProviders extension.
- 
User's Guide
 - 
Integration
 - 
Extensions
 - 
Internals
 - 
Releases
 - 
Community