现在我正在阅读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 :(得分: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
实例请求它。)