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方法。

results matching ""

    No results matching ""