使用guice创建多个类实例

时间:2013-06-06 16:14:04

标签: java guice

有一个类保存一些状态并实现一个接口。此类应在具有不同配置的GUICE模块中多次注册。该类具有与其他bean的依赖关系,应由GUICE注入。 例如:

public class MenuItemImpl implements MenuItem {
  @Inject
  AnyService service;

  public MenuItemImpl(String caption) {
    this.caption = caption;
  }
 //...
}

也可以使用公共设置器而不是使用c'tor参数。

在Guice模块中,我想绑定MenuItemImpl类的多个实例。

我尝试使用Provider<T>,但是在这种情况下不会注入依赖bean。

Multibinder<MenuItem> binder = Multibinder.newSetBinder(binder(), MenuItem.class);
binder.addBinding().toProvider( new Provider<MenuItem>() {
  @Override
  public MenuItem get() {
      return new MenuItemImpl("StartCaption");
  }
}

我看了一下@Assist注释。但是,我想在模块中的绑定阶段指定配置,而不是在使用bean时指定。

我看到的唯一解决方法是为每个配置创建不同的子类,这是不好的样式imho,而不是OO的目的。

1 个答案:

答案 0 :(得分:1)

public class A
{
    @Inject
    @Named("startCaption")
    private MenuItem menuItem;

}

public class B
{
    @Inject
    @Named("endCaption")
    private MenuItem menuItem;

}

和Guice模块

    String[] captions = { "startCaption", "endCaption" };

    for(final String caption : captions)
    {
        bind(MenuItem.class).annotatedWith(Names.named(caption)).toProvider(
        new Provider<MenuItem>()
        {
            public MenuItem get()
            {
                return new MenuItemImpl(caption);
            }

        });
    }