2016-06-21 3 views
2

Ich versuche Sinn des folgenden Anbieter zu machen:Wie funktioniert ein Guice-Provider, der als Identitätsfunktion implementiert ist?

@Provides 
@ScopeMatching 
@MatchingScopeAnnotation 
MatchingBag provideBag(MatchingBag bag) { 
    return bag; 
} 

Hier sind die Erklärungen der referenzierten Anmerkungen:

@BindingAnnotation 
@Target({ FIELD, PARAMETER, METHOD }) 
@Retention(RUNTIME) 
public @interface ScopeMatching { 
    // nothing 
} 

@ScopeAnnotation 
@Target({ TYPE, METHOD }) 
@Retention(RUNTIME) 
private @interface MatchingScopeAnnotation { 
    // nothing 
} 

seltsame Blicke, einen Anbieter zu definieren, die nur eine Identitätsfunktion ist. Ich kann sehen, dass das Löschen des Anbieters zu Fehlern bei der Eingabe führt.

Können Sie mir bitte helfen zu verstehen, was die Wirkung des Anbieters ist? Ist es nicht ein Henne-Ei-Problem, um den Anbieter zu lösen? Wie macht es Guice?

+0

Ich vermute, dass es einen anderen Anbieter gibt, oder eine automatische Singleton mit einer der beiden Annotationen annotiert und diese Funktion bietet diese 'bag' Bindung an die Konstruktoren kommentiert mit der Bereich Annotation dieser Funktion. – dlamblin

+0

Ja, MatchingBag hat einen Konstruktor: @Inject MatchingBag (Config-Konfiguration) (wir können davon ausgehen, dass Guice weiß, wie die Config-Klasse aufgebaut wird). Beachten Sie, dass diese Konstruktoren nicht mit Bereichen versehen sind. –

Antwort

3

Um Guice, ein @ScopeMatching MatchingBag ist ein ganz anderer Schlüssel als ein unqualifizierter MatchingBag. Entfernt, können Sie es als analog zu @Provides A provideA(AImpl impl) { return impl; } denken.

Guice verhält sich wie ein Map<Key, Provider>, wobei ein Schlüssel ein qualifizierter Typ mit einer optionalen Bindungsannotation ist. Sie haben hier eine benutzerdefinierte Bindungsanmerkung mit der entsprechenden Meta-Annotation ScopeMatching. Folglich sind mit der gewünschten Bindung beide Schlüssel (MatchingBag und @ScopeMatching MatchingBag) über Ihr Objektdiagramm verfügbar, wobei Ersteres immer eine neue Instanz zurückgibt und Letzteres eine Instanz im Bereich MatchingScopeAnnotation zurückgibt (was ein neuer sein kann) Instanz und kann eine gespeicherte/zwischengespeicherte Instanz gemäß Ihrer Scope-Implementierung sein).

Ihre "Identität" Bindung entspricht die möglicherweise mehr-erkennbare bind Version:

bind(MatchingBag.class).annotatedWith(ScopeMatching.class) 
    .to(MatchingBag.class) 
    .in(MatchingScopeAnnotation.class); 

... oder äquivalent, und noch deutlicher:

bind(Key.get(MatchingBag.class, ScopeMatching.class)) 
    .to(Key.get(MatchingBag.class)) 
    .in(MatchingScopeAnnotation.class); 

Sehen Sie mehr in den Guice docs on Binding Annotations .