有没有办法在Guice 3.0中声明默认绑定?
以下是我的预期示例:
//Constructor for Class Impl1
@Inject
public Impl1 (@One IMyOwn own)
{
...
}
//Constructor for Class Impl2
@Inject
public Impl2 (@Two IMyOwn own)
{
...
}
//Declare a default binding
bind(IMyOwn.class).to(DefaultMyOwn.class);
//Then, if I want to bind a custom implementation for @Two
bind(IMyOwn.class).annotatedWith(Two.class).to(TwoMyOwn.class);
实际上,这个例子不起作用,因为我必须为所有注释声明一个绑定(@ One,@ Two)。
Guice有解决方案吗? 感谢。
答案 0 :(得分:2)
使用@Named绑定。
Guice附带一个内置的绑定注释@Named,它使用一个字符串:
public class RealBillingService implements BillingService {
@Inject
public RealBillingService(@Named("Checkout") CreditCardProcessor processor) {
...
}
要绑定特定名称,请使用Names.named()创建要传递给annotatedWith的实例:
bind(CreditCardProcessor.class)
.annotatedWith(Names.named("Checkout"))
.to(CheckoutCreditCardProcessor.class);
所以在你的情况下,
//Constructor for Class Impl1
@Inject
public Impl1 (@Named("One") IMyOwn own)
{
...
}
//Constructor for Class Impl2
@Inject
public Impl2 (@Named("Two") IMyOwn own)
{
...
}
,您的模块将如下所示:
public class MyOwnModule extends AbstractModule {
@Override
protected void configure() {
bind(IMyOwn.class)
.annotatedWith(Names.named("One"))
.to(DefaultMyOwn.class);
bind(IMyOwn.class)
.annotatedWith(Names.named("Two"))
.to(TwoMyOwn.class);
}
}
答案 1 :(得分:0)
Guice尝试尽可能多地检查您的配置(也称为绑定)。这也意味着,Guice无法判断@One
的缺失绑定是错误还是应映射到某些默认情况。
如果您对详细信息感兴趣,请在Guice中查找BindingResolution序列。由于步骤4和步骤6处理绑定注释,第6步明确禁止默认,我认为你运气不好。
0.6。如果依赖项具有绑定注释,请放弃。 Guice不会为带注释的依赖项创建默认绑定。
所以你能做的最好的事情就是给Guice提供一个提示,@One
应该像这样映射到默认值:
bind(IMyOwn.class).annotatedWith(One.class).to(IMyOwn.class);
因此,您无需多次声明具体的默认类DefaultMyOwn
。
答案 2 :(得分:0)
使用Guice 4.X,有Optional Binder。
public class FrameworkModule extends AbstractModule {
protected void configure() {
OptionalBinder.newOptionalBinder(binder(), Renamer.class);
}
}
public class FrameworkModule extends AbstractModule {
protected void configure() {
OptionalBinder.newOptionalBinder(
binder(),
Key.get(String.class, LookupUrl.class))
.setDefault().toInstance(DEFAULT_LOOKUP_URL);
}
}
在Guice 3.0中,您可以利用默认构造函数的自动绑定。
- 使用单个@Inject或公共无参数构造函数。
醇>
但这有约束,因为你的默认构造函数需要具有相同的具体类,因此派生可能会变得很麻烦。