2011-08-18 46 views
1

我想为每个注释绑定一个唯一的单例实例,如下所示,例如Client1.a != Client1.bClient1.a == Client2.aGuice:我如何将同一类的带注释的单例绑定到不同的实例?

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

​​

回答

3

感谢Sam Berlin在Google Groups Guice论坛。这不起作用的原因是因为OneOfEachAnnotation已经用@Singleton注解了。删除@Singleton注释解决了这个问题。

萨姆解释了为什么:

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

都这么说,:

的声明 “以OneOfEachAnnotation创建从@A OneOfEachAnnotation绑定,使@A OneOfEachAnnotation一个单身。”与@B一样的东西。

无视OneOfEachAnnotation@Singleton一秒钟(假设它不存在),那么这将具有的行为:

  • 使用者注射OneOfEachAnnotation(注明)多次:一个新创建每一次,因为那个绑定是无与伦比的。

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

OneOfEachAnnotation上有@Singleton,然后吉斯认为,无范围值单身。因此,当@A指向未注释的链接时,它将创建第一个实例。当@B链接未注释时,Guice注意到未注释的版本(也是Singleton)已经被构建,并返回该实例。

相关问题