Provides方法
@Provides methods
当需要使用编写代码来创建绑定对象时(例如需要做一些额外的初始化或配置工作),可以使用@Provides
方法。@Provides
方法必须在module中定义,并且必须使用@Provides
注解。方法的返回值就是将要被绑定的类型。当注入器injector需要该类型的一个实例时,它就会执行这个方法来获取。
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
...
}
@Provides
TransactionLog provideTransactionLog() {
DatabaseTransactionLog transactionLog = new DatabaseTransactionLog();
transactionLog.setJdbcUrl("jdbc:mysql://localhost/pizza");
transactionLog.setThreadPoolSize(30);
return transactionLog;
}
}
如果@Provides
方法上有绑定注解,例如@PayPal
或@Named("Checkout")
,那么Guice就会基于绑定注解来绑定类型(作用类似于Binding Annotations一节)。@Provides
方法中的使用到的依赖可以通过参数传递进去,注入器会在执行方法的时候逐一检查这些参数,并恰当的绑定实例。
@Provides @PayPal
CreditCardProcessor providePayPalCreditCardProcessor(
@Named("PayPal API key") String apiKey) {
PayPalCreditCardProcessor processor = new PayPalCreditCardProcessor();
processor.setApiKey(apiKey);
return processor;
}
异常
Guice不允许从Providers(JDK8中定义的接口)中抛出异常。从@Provides
方法中抛出的异常会被包装成ProvisionException
。从@Provides
方法中抛出任何checked异常或runtime异常通常都是不建议的。如果因为某些原因一定要抛出异常,可以使用ThrowingProviders extension中的@CheckedProvides
方法。