使用提供者方法绑定注释的含义

时间:2017-02-12 04:32:14

标签: java dependency-injection guice

现在我正在阅读Guice的官方文档,我看到了这段代码。

    @Provides @PayPal
  CreditCardProcessor providePayPalCreditCardProcessor(
      @Named("PayPal API key") String apiKey) {
    PayPalCreditCardProcessor processor = new PayPalCreditCardProcessor();
    processor.setApiKey(apiKey);
    return processor;
  }

在上面的代码中,@PayPal是什么意思? 在文档的页面中,我理解原始绑定注释的含义。我们可以自定义它。但用法是这样的。

@Inject
  public RealBillingService(@PayPal CreditCardProcessor processor,
      TransactionLog transactionLog)

在代码中,@PayPal表示此参数processor应注入注释指示的实例。 那么,它在第一个代码中究竟意味着什么?

2 个答案:

答案 0 :(得分:1)

在第一个代码中,它表示“当您找到CreditCardProcessor注释@Paypal时,请将此方法用作提供者”。

具体而言,第一个用于定义绑定,第二个用于请求绑定。

第一个,可以在configure()方法中重写:

protected void configure() {
  PayPalCreditCardProcessor processor = new PayPalCreditCardProcessor();
  processor.setApiKey(apiKey);
  bind(CreditCardProcessor.class).annotatedWith(PayPal.class).toInstance(processor);
}

但是......你实际上不能,因为那时你会有一个单身人士。从来没有写过你想要一个单身人士。

因此,提供方法是一个很好的工具,可以让你创建新实例并在传递它们之前初始化它们。

答案 1 :(得分:0)

将注释视为方法返回类型的一部分。您列出的@Provides方法不仅提供CreditCardProcessor,而且提供@PayPal CreditCardProcessor。因此,该方法编写为@Provides @PayPal CreditCardProcessor

然后,您可以在第二次使用中请求@PayPal CreditCardProcessor,方法是在@Inject - 带注释的方法或构造函数中注释参数,或者将注释添加到@Inject - 带注释的字段。 (您也可以通过创建Injector直接从Key实例请求它。)