Guice:如何将同一类的带注释的单例绑定到不同的实例?

时间:2011-08-18 17:24:12

标签: singleton guice

我想为每个注释绑定一个唯一的单例实例,如下所示,例如Client1.a != Client1.bClient1.a == Client2.a

class X {}

@Singleton class OneOfEachAnnotation { 
   @Inject OneOfEachAnnotation(X x) { }
}

class Client1 {
   @Inject Client(@A OneOfEachAnnotation a, @B OneOfEachAnnotation b) {}
}

class Client2 {
   @Inject Client(@A OneOfEachAnnotation a, @B OneOfEachAnnotation b) {}
}

This answer似乎声称我可以像这样完成绑定,但是当我这样做时,Client1.a == Client1.b

bind(OneOfEachAnnotation.class).annotatedWith(A.class).to(OneOfEachAnnotation.class).in(Singleton.class);
bind(OneOfEachAnnotation.class).annotatedWith(B.class).to(OneOfEachAnnotation.class).in(Singleton.class);

1 个答案:

答案 0 :(得分:3)

感谢Sam Berlin在Google Groups Guice论坛上发表的演讲。这不起作用的原因是因为OneOfEachAnnotation已经使用@Singleton注释。删除@Singleton注释可以解决问题。

Sam解释了原因:

陈述:

bind(OneOfEachAnnotation.class).annotatedWith(A.class).
 to(OneOfEachAnnotation.class).in(Singleton.class);
bind(OneOfEachAnnotation.class).annotatedWith(B.class).
 to(OneOfEachAnnotation.class).in(Singleton.class);

说,“从@A OneOfEachAnnotationOneOfEachAnnotation创建绑定,并使@A OneOfEachAnnotation成为单身人士。”与@B相同。

忽略@Singleton OneOfEachAnnotation一秒钟(假设它不存在),那么这将有以下行为:

  • 用户多次注入OneOfEachAnnotation(未注释):每次都会创建一个新的,因为该绑定是未绑定的。

  • 用户注入@A OneOfEachAnnotation,第一次链接到未注释的OneOfEach,看到它需要构建,并构建它。第二次绑定已经配置,因此Scopes.SINGLETON不会再次转到链接绑定。 (@B@A相同。)

OneOfEachAnnotation上有@Singleton时,Guice认为未编码的值也是单身。因此,当@A链接到未注释时,它将创建第一个实例。当@B链接未注释时,Guice注意到已经构造了未注释的版本,也是Singleton,并返回该实例。