Provider BindingsWhen 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!
|