Providerバインディング
@Providesメソッドが複雑になりはじめると、それを独立したクラスに移動したくなる。 Guiceの提供する、シンプルで一般的なインターフェースであるProviderインターフェースを実装したクラスとすればよい。
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;
}
}このプロバイダを.toProvider句に指定する。
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(TransactionLog.class)
.toProvider(DatabaseTransactionLogProvider.class);
}プロバイダが複雑な場合にはテストを忘れないこと!
