2009-07-02 10 views
2

J'essaie d'utiliser Google Guice avec les propriétés @Inject et @Singleton comme suit:erreur de configuration Guice

Je:

  1. un module avec une méthode configure() vide.
  2. Une interface IFoo
  3. Une classe Foo (implémentant IFoo), annotée avec @Singleton, avec un constructeur sans paramètre annoté avec @Inject. C'est le constructeur annoté unique.

Les classes, le constructeur et l'interface sont publiques, et encore que je reçois l'erreur suivante:

No implementation for IFoo was bound.

Répondre

5

Vous voulez dire que vous obtenez l'erreur lors de cette opération?

IFoo foo = injector.getInstance(IFoo.class); 

Eh bien, c'est évident. Si le configure() est vide, comment devrait savoir avec quelle classe satisfaire la dépendance pour IFoo.

Ajoutez simplement cela dans la méthode configure() et cela devrait fonctionner. Maintenant, guice sait avec quelle classe satisfaire la dépendance.

bind(IFoo.class).to(Foo.class); 

Si vous ne voulez pas configurer ce dans le module, vous pouvez annoter l'interface. par exemple.

@ImplementedBy(Foo.class) 
public interface IFoo { 
    ... 
} 

Les annotations @Singleton indique que Guice retourner la même instance pour la classe (le modèle Singleton) chaque fois qu'une demande de la classe se fait via Injector.getInstance() au lieu de créer une nouvelle instance à chaque fois. Mais notez que ceci est seulement un Singleton par Injecteur plutôt que par Classloader.

+1

L'annotation @Singleton sur Bar ne dit-elle pas à Guiced que c'est l'implémentation concrète d'IBar? Je n'aime pas avoir un grand module() - Je préfère annoter des classes. Comment peut-on accomplir cela avec Guist? – ripper234

+2

Réponse étendue – jitter

+1

Merci, c'est ce dont j'avais besoin. – ripper234