Java GUI使用不同的提供程序实例化不同的类

Java GUI使用不同的提供程序实例化不同的类,java,dependency-injection,guice,Java,Dependency Injection,Guice,我有两项活动 public class GetActivity { ChildClass childclass; @Inject public GetActivity(ChildClass childClass) { this.childClass = childclass; } String id = childClass.get(id); .... } public class SaveActivity {

我有两项活动

public class GetActivity
{
    ChildClass childclass;

    @Inject
    public GetActivity(ChildClass childClass)
    {
        this.childClass = childclass;
    }
    String id = childClass.get(id);
    ....
}

public class SaveActivity
{
    ChildClass childclass;

    @Inject
    public SaveActivity(ChildClass childClass)
    {
        this.childClass = childclass;
    }
    childClass.save(id);
    ....
}
ChildClass是具有以下方法的接口

public interface ChildClass
{
    String get(id);
    void save(id);
}
其实施方式如下:

public class ChildClassImpl implements ChildClass
{
    String storage;

    public ChildClassImpl(String storage)
    {
        this.storage =storage;
    }

    String get(Id)
    {
       someOtherObject.get(id, storage);
    }

    void save(id)
    {
       someOtherObject.save(id, storage);
    }
}
我编写了将返回ChildClass方法的提供者

public class ChildClassProvider1 implements Provider<ChildClass>
{
    @Override
    public ChildClass get()
    {
      ChildClass childClass = new ChildClass("hello");
    }
}

public class ChildClassProvider2 implements Provider<ChildClass>
{
    @Override
    public ChildClass get()
    {
      ChildClass childClass = new ChildClass("secondHello");
    }
}
公共类ChildClassProvider1实现提供程序
{
@凌驾
公共子类get()
{
ChildClass ChildClass=新的ChildClass(“你好”);
}
}
公共类ChildClassProvider2实现提供程序
{
@凌驾
公共子类get()
{
ChildClass ChildClass=新的ChildClass(“secondHello”);
}
}

我想确保GetActivity和SaveActivity是使用提供程序ChildClassProvider1初始化的,但是其他类应该使用ChildClassProvider2。如何使用guice实现这一点?

有几个选项,具体取决于您希望将此需求嵌入代码的难度

首先,通过模块中提供的方法:

class YourModule extends AbstractModule {
  @Override protected void configure() {
    bind(ChildClass.class).toProvider(ChildClassProvider1.class);
  }

  @Provides SaveAction saveAction(ChildClassProvider2 provider) {
    return new SaveAction(provider.get());
  }
}
其次,通过绑定注释 或者,提供绑定注释:

@BindingAnnotation @Retention(RUNTIME)
@interface YourAnnotation {}
然后:

第二个选项是“更硬地烘焙”,因为您必须在代码中添加绑定注释;但是它不那么脆弱(在这个意义上,您不必显式地调用构造函数),并且感觉“更加guice-y”


第一种选择是保持它的松散性,如果您希望在某些情况下能够以不同的方式进行配置。

我不理解您的第一种方法,您可以详细说明一下。
// Ctor of SaveActivity.
@Inject
public SaveActivity(@YourAnnotation ChildClass childClass) { ... }

// In your module:
bind(ChildClass.class).annotatedWith(YourAnnotation.class)
    .toProvider(ChildClassProvider2.class);