【发布时间】:2015-10-28 21:32:48
【问题描述】:
在探索 Guice 时,我对注入依赖项的方式有疑问。
根据我的理解,DI 的重要方面之一是,依赖项是已知的并且在运行时注入。
在 Guice 中,要注入依赖项,我们需要添加绑定或实现提供程序。添加依赖项需要一个类对象,该对象会在该类上添加编译时依赖项。避免这种情况的一种方法是将其实现为提供者,并让提供者使用反射来动态加载类。
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(CreditCardProcessor.class).toProvider(
BofACreditCardProcessorProvider.class);
bind(CreditCardProcessor.class).annotatedWith(BofA.class).toProvider(
BofACreditCardProcessorProvider.class);
bind(CreditCardProcessor.class).annotatedWith(Amex.class).toProvider(
AmexCreditCardProcessorProvider.class);
}
@Provides
PaymentProcessor createPaymentProcessor() {
return new PayPalPaymentProcessor();
}
@Provides
PayPalPaymentProcessor createPayPalPaymentProcessor() {
return new PayPalPaymentProcessor();
}}
Guice 选择类对象而不是类名有什么原因吗?那可能已经消除了编译时依赖,对吧?
【问题讨论】:
-
老实说,我没明白。你能说得更具体点吗?
-
@MilanBaran 好的,让我再试一次。假设有三个组件 A、B 和 C。C 需要 A 和 B 的实现。那是我们将 A 和 B 的实现注入到 C。现在想象有一个 maven 模块 M1 想要注入 A 的实现和B 但它们归其他 maven 模块 M2 所有。要注入实现,模块 M 应该对模块 M2 有编译依赖。
-
spring 使用 XML 作为支持这一点的方法之一。您可以在 XML 中指定实现者。这个链接link 有一个这样的配置文件的例子。
标签: java dependency-injection guice