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); }
プロバイダが複雑な場合にはテストを忘れないこと!