基于类的注释绑定构造函数参数

时间:2011-10-05 11:10:10

标签: guice guice-3

我有一个界面: InterfaceA

我有一个班级: ConcreteA

我还有两个注释: @AnnotA @AnnotB

我完成了以下绑定:

bind(InterfaceA).annotatedWith(AnnotA).to(ConcreteA);
bind(InterfaceA).annotatedWith(AnnotB).to(ConcreteA);

接下来,类ConcreteA有一个构造函数,它接受一个名为 hostName String参数。

class ConcreteA
{
    @Inject
    public ConcreteA(@Named("hostName") hostName) {
    }

    ... <rest of class>
}

我需要使用代码来描述以下内容:

如果ConcretaA使用@AnnotA,则将hostName绑定为String值为“localhost”

如果ConcreteA正在使用@AnnotB,那么将hostName与String值'externalhost'绑定

对此有何解决方案?

2 个答案:

答案 0 :(得分:1)

我认为在您的情况下,您可以考虑将每个绑定放在自己的私有模块中。

class MyModule() { 
  install(new PrivateModule() {
    public void configure() {
       bind(InterfaceA).to(ConcreteA);
       bind(String.class).annotatedWith(Names.named("hostName").to("localhost");
       expose(InterfaceA).annotatedWith(AnnotA.class);
    }});
  install(new PrivateModule() {
    public void configure() {
       bind(InterfaceA).to(ConcreteB);
       bind(String.class).annotatedWith(Names.named("hostName").to("externalhost");
       expose(InterfaceA).annotatedWith(AnnotB.class);
    }});
}

(这是来自内存和语法可能不是100%正确。)

有关详细信息,请从the Guice FAQ开始,然后在该页面搜索“机器人腿” - 我不是在开玩笑:)

在常见问题解答的这一部分的两个附加链接背后还有更多细节。

答案 1 :(得分:0)

以下是解决机器人双腿问题的完整示例代码清单:

http://pastie.org/368348