我想为每个注释绑定一个唯一的单例实例,如下所示,例如Client1.a != Client1.b
和Client1.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);
答案 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 OneOfEachAnnotation
到OneOfEachAnnotation
创建绑定,并使@A OneOfEachAnnotation
成为单身人士。”与@B
相同。
忽略@Singleton
OneOfEachAnnotation
一秒钟(假设它不存在),那么这将有以下行为:
用户多次注入OneOfEachAnnotation
(未注释):每次都会创建一个新的,因为该绑定是未绑定的。
用户注入@A OneOfEachAnnotation
,第一次链接到未注释的OneOfEach
,看到它需要构建,并构建它。第二次绑定已经配置,因此Scopes.SINGLETON
不会再次转到链接绑定。
(@B
与@A
相同。)
当OneOfEachAnnotation
上有@Singleton
时,Guice认为未编码的值也是单身。因此,当@A
链接到未注释时,它将创建第一个实例。当@B
链接未注释时,Guice注意到已经构造了未注释的版本,也是Singleton,并返回该实例。