Je voudrais compléter la réponse de Marcin, en ajoutant que vous ne devez pas vous limiter à l'utilisation toInstance()
ou les méthodes du fournisseur dans une telle situation.
Ce qui suit fonctionnera tout aussi bien:
bind(Person.class).annotatedWith(Driver.class).to(MartyMcFly.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(DocBrown.class).in(Singleton.class);
[...]
@Inject
public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... }
Guice injectera les dépendances, comme d'habitude lors de l'instanciation des classes et DocBrown Marty McFly.
Notez que cela fonctionne également lorsque vous souhaitez lier plusieurs singletons du même type:
bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class);
Pour que cela fonctionne, vous devez vous assurer que Person
est pas lié dans le Singleton portée, soit explicitement dans le module Guice, soit avec l'annotation @Singleton
. Plus de détails en this Gist.
Édition: L'exemple de code que je donne comme exemple provient d'un Guice Grapher Test. Regarder les tests de Guice est un excellent moyen de mieux comprendre comment utiliser l'API (qui s'applique également à tous les projets avec de bons tests unitaires).
ou une méthode @Provides si elle a des dépendances, j'ai raté ce bit de la documentation (http://code.google.com/docreader/#p=google-guice&s=google-guice&t=ProvidesMethods) dépendances peuvent être passé en tant que paramètres de la méthode. L'injecteur va exercer les liaisons pour chacun d'entre eux avant d'invoquer la méthode. – Matt
Vous n'avez pas besoin de le lier à une instance. Deux annotations différentes à la même classe, dans la portée singleton, créeront déjà deux instances distinctes. –
@Filip, j'ai essayé ce que vous suggérez, et j'ai reçu la même instance pour les deux annotations. J'ai utilisé 'bind (MySingleton.class) .annotatedWith (One.class) .to (MySingleton.class) .in (Singleton.class); bind (MySingleton.class) .annotatedWith (Two.class) .to (MySingleton.class) .in (Singleton.class); ' –