Guice用不同的提供者实例化不同的类

时间:2017-02-23 23:03:56

标签: java dependency-injection guice

我有两项活动

public interface ChildClass
{
    String get(id);
    void save(id);
}

ChildClass是具有以下方法的接口

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);
    }
}

并将其实施为以下

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");
    }
}

我编写了将返回ChildClass方法的提供程序

startDate = n  (as page = 0)
endDate = n - 5 days

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

1 个答案:

答案 0 :(得分:1)

有两种选择,取决于您希望将此要求融入代码的难度。

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

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 {}

然后:

// Ctor of SaveActivity.
@Inject
public SaveActivity(@YourAnnotation ChildClass childClass) { ... }

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

第二个选项是&#34;更难以烘焙它#34;因为你必须在代码中加入绑定注释;但它不那么脆弱(从某种意义上说,你不必明确地打电话给构造函数),并且感觉更加明智 - &#34;。

如果您希望在某些情况下能够以不同方式配置内容,那么第一个选项是保持它更宽松。