Guice - 默认绑定定义

时间:2012-09-01 07:59:00

标签: java binding guice

有没有办法在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有解决方案吗? 感谢。

3 个答案:

答案 0 :(得分:2)

使用@Named绑定。

来自Guice Reference on Github:

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中,您可以利用默认构造函数的自动绑定。

  
      
  1. 使用单个@Inject或公共无参数构造函数。
  2.   

但这有约束,因为你的默认构造函数需要具有相同的具体类,因此派生可能会变得很麻烦。