-
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