2009-07-02 6 views
2

Ich versuche, Google Guice mit den @Inject und @Singleton Eigenschaften wie folgt zu verwenden:Guice Konfigurationsfehler

ich habe:

  1. Ein Modul mit einer leeren configure() Methode.
  2. Eine Schnittstelle IFoo
  3. Eine Klasse Foo (Implementieren von IFoo), mit @Singleton annotiert, mit einem parameterlosen Konstruktor, der mit @Inject annotiert ist. Dies ist der einzelne annotierte Konstruktor.

Die Klassen, Konstruktor und Schnittstelle sind öffentlich, und immer noch die folgende Fehlermeldung erhalte ich:

No implementation for IFoo was bound.

Antwort

5

Sie meinen, Sie den Fehler erhalten, wenn dies zu tun?

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

Na dann ist es offensichtlich. Wenn der configure() leer ist, wie guice mit welcher Klasse wissen sollte, um die Abhängigkeit für IFoo zu erfüllen.

Fügen Sie das einfach in der configure() Methode hinzu und es sollte funktionieren. Jetzt weiß Guice mit welcher Klasse die Abhängigkeit zu befriedigen.

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

Wenn Sie im Modul konfigurieren möchten dies nicht können Sie die Schnittstelle mit Anmerkungen versehen. z.B.

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

Die @Singleton Anmerkungen sagt nur guice die gleiche Instanz für die Klasse (das Singleton Pattern) jedes Mal eine Anforderung für die Klasse über Injector.getInstance() wird zurückkehren, anstatt jedes Mal eine neue Instanz zu schaffen. Aber beachten Sie, dass dies nur ein Singleton pro Injektor und nicht ein Classloader ist.

+1

Schreibt die @Singleton-Anmerkung auf Bar Guiced nicht, dass es die konkrete Implementierung von IBar ist? Ich mag es nicht, ein großes Modul zu haben() - ich bevorzuge es, Klassen zu kommentieren. Wie schafft man das mit Guist? – ripper234

+2

Antwort erweitert – jitter

+1

Danke, das habe ich gebraucht. – ripper234