【问题标题】:Google Guice binding using Annotation and Key class使用 Annotation 和 Key 类的 Google Guice 绑定
【发布时间】:2020-02-26 04:48:02
【问题描述】:

假设我们有由 AImpl.java 实现的 A.java 接口和由 Bimpl.javaB.java 接口/strong>

上面的类被绑定在如下两个模块中

Module1 {
    bind(A.class).to(AImpl.class);
    bind(B.class).to(BImpl.class);
}

Module2 {
    Key<A> aKey = Key.get(A.class, AnAnnot.class);
    bind(aKey).to(AImpl.class);
    Key<B> bKey = Key.get(B.class, AnAnnot.class);
    bind(bKey).to(BImpl.class);
}


Class AImpl implements A {
}

Class BImpl implements B {

@Inject
BImpl(A aImpl) {
 //??
}
}

BImpl 指的是 A

对于使用 Annotation 绑定的 BImpl,我想要相应的 aImpl,使用 Annotation 绑定,但这里我得到的是未使用 Annotation 绑定的 aImpl

请推荐

【问题讨论】:

  • 顺便问一下,你是不是对带注释和不带注释都使用相同的实现?
  • 没错。我正在尝试找到一种对齐接线的方法;类绑定了注解和没有注解。
  • 那么问题出在哪里,两种情况下你得到的是同一个实例吗?我有点失落:/
  • @Olivier - 感谢您提供帮助,但这并不是我想要的。可能是我没有很好地表达我的问题。请参阅我使用的以下解决方案,可能不是最好的,但效果很好

标签: binding annotations guice


【解决方案1】:

我可以使用以下模式来实现。可能有更简单的方法。很高兴知道更多

A.java

public interface A {
    String aMethod();
}

AImpl.java

public class AImpl implements A {

    private String moduleName;

    public AImpl(String moduleName) {
        this.moduleName = moduleName;
    }

    @Override
    public String aMethod() {
        return moduleName;
    }
}

B.java

public interface B {
    String bMethod();
}

Bimpl.java

public class BImpl implements B {
    private final A a;

    BImpl(A a) {
        this.a = a;
    }

    @Override
    public String bMethod() {
        return a.aMethod();
    }
}

AnAnnot.java

@Target(PARAMETER)
@Retention(RUNTIME)
@BindingAnnotation
public @interface AnAnnot {
}

BProvider.java

public class BProvider  implements Provider<B> {
    private final A a;

    @Inject
    BProvider(A a) {
        this.a = a;
    }

    @Override
    public B get() {
        return new BImpl(a);
    }
}

BHavingAnnotatedA.java

public class BHavingAnnotatedA implements Provider<B> {
    private final A a;

    @Inject
    BHavingAnnotatedA(@AnAnnot A a) {
        this.a = a;
    }

    @Override
    public B get() {
        return new BImpl(a);
    }
}

ABModule1.java

public class ABModule1 extends AbstractModule {

    @Override
    protected void configure() {
        bind(A.class).to(AImpl.class);
        bind(B.class).toProvider(BProvider.class);
    }
}

ABModule2.java

public class ABModule2 extends AbstractModule {

    @Override
    protected void configure() {
        Key<A> aKey = Key.get(A.class, AnAnnot.class);
        bind(aKey).to(AImpl.class);
        Key<B> bKey = Key.get(B.class, AnAnnot.class);
        bind(bKey).toProvider(BHavingAnnotatedA.class);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2023-04-09
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多