me gustaría complementar la respuesta de Marcin, añadiendo que no tiene por qué limitarse a la utilización de toInstance()
o métodos del proveedor en tal situación.
El siguiente funcionará igual de 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 inyectará las dependencias como de costumbre cuando una instancia de las clases de Marty McFly y DocBrown.
Tenga en cuenta que también funciona cuando se quiere enlazar varios conjuntos unitarios de la mismo 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);
Para que esto funcione, debe asegurarse de que Person
no está ligada en el Singleton alcance, explícitamente en el módulo de Guice, o con la anotación @Singleton
. Más detalles en this Gist.
Edit: El código de ejemplo que doy como ejemplo proviene de un Guice Grapher Test. Ver las pruebas de Guice es una excelente manera de comprender mejor cómo usar la API (que también se aplica a cada proyecto con buenas pruebas de unidades).
o un método @Provides si tiene dependencias, me he perdido este bit de los documentos (http://code.google.com/docreader/#p=google-guice&s=google-guice&t=ProvidesMethods) dependencias pueden pasarlo como parámetros del método. El inyector ejercerá los enlaces para cada uno de estos antes de invocar el método. – Matt
No es necesario que lo vincule a una instancia. Dos anotaciones diferentes para la misma clase, en el alcance singleton, ya crearán dos instancias separadas. –
@Filip, intenté con lo que sugería y recibí la misma instancia para ambas anotaciones. Usé 'bind (MySingleton.class) .annotatedWith (One.class) .to (MySingleton.class) .in (Singleton.class); bind (MySingleton.class) .annotatedWith (Two.class) .to (MySingleton.class) .in (Singleton.class); ' –