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

标签 java dependency-injection guice

我有两项 Activity

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是一个具有以下方法的接口(interface)

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

我想确保 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());
  }
}

其次,通过绑定(bind)注解 或者,提供绑定(bind)注释:

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

第二个选项是“更努力地烘焙它”,因为你必须将绑定(bind)注释放在代码中;但它不那么脆弱(从某种意义上说,您不必显式调用构造函数),并且感觉“更 guice-y”。

如果您希望在某些情况下能够进行不同的配置,第一个选项是保持宽松一点。

关于java - Guice 使用不同的提供者实例化不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42427850/

相关文章:

java - 如何检测正在编译我的java源文件的编译器的版本

带有 boolean 值的 java.lang.NullPointerException

java - Spring:嵌套的应用程序上下文

Android - 设置 Roboguice 2.0?

java - GuiceConfig 和 JSP_TEMPLATES_BASE_PATH

java - 无法运行 jacoco 代码覆盖工具

java - 如何实现一个以数组列表为键的Map

java - Spring AOP 代理没有按预期工作

android-studio - 在 Dagger2 中查找提供者的便捷方式

java - Guice 和一般应用程序配置