2012-04-13 4 views
0

Guice bietet zwei Varianten der sogenannten Bindung Anmerkungen, die wirklich scheint zu brechen Klassen- und Instanzebene Anmerkungen:Guice: Klassen- oder Instanzebene Bindung Anmerkungen

„Class-Niveau“ :

bind(Service.class).annotatedWith(Red.class).to(RedServiceImpl.class); 

@Red 
public class SomeService implements Service { ... } 

Service redSvc = injector.getInstance(SomeService.class); 

"Instanz-Ebene":

bind(Service.class).annotatedWith(Names.named("Blue").to(BlueServiceImpl.class); 
@Blue blueSvc = injector.getInstance(Service.class); 

Wann ist ein Verfahren bevorzugt über die andere? Es scheint, dass Annotationen auf Klassenebene absoluter/unflexibler sind als Instanzenebene. Vorteile/Nachteile/Nachteile/Fallen beider Methoden?

Antwort

1

Ich bin mir nicht sicher, ob ich Ihre Frage verstehe. Ihre Verwendung von verbindlichen Anmerkungen ist unregelmäßig. Normalerweise würden Sie keine lokale Variable oder eine Klasse annotieren, sondern Felder und Parameter.

Ihr erstes Codebeispiel wird bewirken, dass der Injektor SomeService zurückgibt, aber nicht wegen Ihrer Annotation oder Ihrer Bindung, sondern weil SomeService eine konkrete Implementierung ist. Haben Sie für diese Stelle gestellt:

Service redSvc = injector.getInstance(Service.class); 

Sie erhalten eine Fehlermeldung erhalten:

1) No implementation for com.example.Service was bound. 
    while locating com.example.Service 

Ihr zweites Beispiel auch falsch ist. Wenn Sie Names verwenden, um eine Bindung zu definieren, müssen Sie @Named verwenden, um auf diese Bindung zuzugreifen. Die Verwendung von @Blue würde einen Compilerfehler verursachen. Die korrekte Verwendung wäre @Named(value="Blue").

Die gemeinsame Best-Practice für eine Bindung Anmerkung, ist dies:

@BindingAnnotation 
@Target({ FIELD, PARAMETER, METHOD }) 
@Retention(RUNTIME) 
public @interface MyAnno 

In diesem Fall diese beiden Fehler kompilieren würde:

@Red // not allowed 
public class SomeService implements Service { ... } 

@Blue // not allowed 
blueSvc = injector.getInstance(Service.class); 
0

Der einzige wirkliche Unterschied besteht darin, dass Sie in einem Fall für eine ganze Annotation binden und im anderen Fall an eine Annotation mit bestimmten Argumenten binden. Nicht alle Annotationen enthalten sogar Argumente. In diesem Fall ist die Bindung mit der Annotationsklasse völlig normal.

Verwandte Themen