2017-02-12 70 views
0

现在我正在阅读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应注射由注释表示的实例。 那么,第一个代码究竟意味着什么呢?

回答

0

将注释看作方法返回类型的一部分。您列出的@Provides方法不是简单地提供CreditCardProcessor,它提供了@PayPal CreditCardProcessor。因此,该方法被写入@Provides @PayPal CreditCardProcessor

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

1

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

具体地说,第一个被用来限定结合,第二个被用来请求的结合。

第一种,可以改写作为configure()方法的规则:

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

可是......你却不能因为这样你就会有一个单例。从来没有写过你想要一个单身人士。

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

相关问题