2011-08-18 37 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)已經被構建,並返回該實例。

相關問題