Passer des paramètres au constructeur avec Guice
J'ai une usine comme ci-dessous,
public final class Application {
private static IFoo foo;
public static IFoo getFoo(String bar)
{
//i need to inject bar to the constructor of Foo
//obvious i have to do something, not sure what
Injector injector = Guice.createInjector();
logger = injector.getInstance(Foo.class);
return logger;
}
}
C'est le Foo définition:
class Foo
{
Foo(String bar)
{
}
}
OK. Je ne suis pas sûr de savoir comment je peux passer ce paramètre à Toto constructeur avec Guice?
Des idées?
Vous devez vous connecter pour publier un commentaire.
Tous les "Guice Paramètre du Constructeur" réponses semblent être incomplète, d'une certaine façon.
Voici une solution complète, y compris l'utilisation:
//Annoter le constructeur et aidé les paramètres sur la mise en œuvre de la classe
//Création d'une usine d'interface avec une méthode create() qui ne prend que la assisté paramètres.
//FooFactory interface n'est pas explicitement que la mise en œuvre de la classe (Guice Magie)
//Lier l'usine d'un fournisseur créé par AssistedInject
//Maintenant l'utiliser:
Beaucoup d'aide ici: https://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/assistedinject/FactoryModuleBuilder.html
Ce que vous êtes probablement à la recherche pour l'utilisation d'un Guice usine. Particulièrement à l'aise avec la
AssistedInject
de fonctionnalités, mais ils ont un manuel de l'exemple en haut de la page. Le court de celui-ci pour le manuel de l'exemple est que vous obtenez de l'usine dans des conditions non-statiquegetFoo
méthode que vous passez quels que soient les paramètres que vous avez besoin et construire l'objet à partir de là.Cela ne fonctionne pas directement si vous avez de la méthode d'interception dans
Foo
, mais il faudra travailler dans de nombreux autres cas.À utiliser
AssistedInject
, ce qui m'a un peu de nettoyant de la sémantique et de moyens moins manuel de câblage, vous aurez besoin de la guice-assistedinject extension dans le classpath, puis lors de la création deFoo
(bien,FooImpl
, nous devrions utiliser des interfaces):Puis vous créez un
FooFactory
interface:Puis dans votre guice module:
Vous pouvez consulter le javadoc pour
FactoryModuleBuilder
pour des exemples plus complexes usines.Je sais que c'est vieux thread mais je viens de toucher la question de moi-même aujourd'hui.
J'ai seulement besoin de deux ou au maximum trois différentes instances de " Foo " et je n'ai vraiment pas envie d'écrire tous les bolierplate code de l'Usine.
Avec un peu de recherche sur google, j'ai trouvé ce Stubbisms – Tony Weblog, je voudrais suggérer cette solution qui est parfait si vous savez exactement ce que les instances dont vous avez besoin.
Dans Guice module:
Ou en java 8:
Et dans le constructeur de votre service où vous avez besoin de Foo instances:
Et Toto dans mon cas:
Espère que cela aide quelqu'un.
Si cette classe est une usine, il doit être un Guice-objet géré, non statique getFoo de la méthode et de la getFoo méthode utilisé seulement
Pas chaque classe doit être instanciée par Guice.
Voir aussi AssistedInject, pour éviter la création de cette usine-vous et laissez Guice d'en créer un pour vous.