mi piacerebbe completare la risposta di Marcin, aggiungendo che non è necessario limitarsi ad usare toInstance()
o metodi di provider in tale situazione.
Quanto segue funziona altrettanto bene:
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 inietta le dipendenze come al solito quando si crea un'istanza delle classi Marty McFly e DocBrown.
Nota che funziona anche quando si desidera associare più single della stesso tipo:
bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class);
Per far funzionare tutto questo, è necessario assicurarsi che Person
non è vincolato in Singleton ambito, esplicitamente nel modulo Guice o con l'annotazione . Maggiori dettagli in this Gist.
Modifica: Il codice di esempio che fornisco come esempio proviene da Guice Grapher Test. Guardare i test di Guice è un ottimo modo per capire meglio come usare l'API (che si applica anche ad ogni progetto con buoni test unitari).
fonte
2009-09-10 21:06:02
o un metodo @Provides se ha le dipendenze, ho perso questo po 'di docs (http://code.google.com/docreader/#p=google-guice&s=google-guice&t=ProvidesMethods) dipendenze possono essere passati come parametri al metodo. L'iniettore eserciterà le associazioni per ognuno di questi prima di invocare il metodo. – Matt
Non è necessario associarlo a un'istanza. Due diverse annotazioni alla stessa classe, in ambito singleton, creeranno già due istanze separate. –
@Filip, ho provato quello che stai suggerendo e ho ricevuto la stessa istanza per entrambe le annotazioni. Ho usato 'bind (MySingleton.class) .annotatedWith (One.class) .to (MySingleton.class) .in (Singleton.class); bind (MySingleton.class) .annotatedWith (Two.class) .to (MySingleton.class) .in (Singleton.class); ' –