2016-06-21 47 views
2

我想作以下提供商的意義:Guice-Provider如何實現身份識別功能?

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

下面是引用註釋的聲明:

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

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

看起來很奇怪確定一個供應商,只是一個身份的功能。我可以看到刪除提供程序會導致注入錯誤,所以它很重要。

你能幫我理解提供者的作用是什麼嗎?解決提供商問題不是雞蛋問題嗎? Guice如何做到這一點?

+0

我在猜測還有另一個提供者,或者是用兩個註解之一註解的自動單例,這個函數提供了綁定的'bag'給註釋了該函數的作用域註解的構造函數。 – dlamblin

+0

是的,MatchingBag有一個構造函數:@Inject MatchingBag(Config config)(我們可以假設Guice知道如何構造Config類)。請注意,這些構造函數沒有使用任何作用域進行註釋。 –

回答

3

對於吉斯,@ScopeMatching MatchingBag是一個完全不同的關鍵比不合格MatchingBag。剝離,你可以認爲它類似於@Provides A provideA(AImpl impl) { return impl; }

Guice的行爲類似於Map<Key, Provider>,其中Key是具有可選綁定註釋的限定類型。這裏有一個自定義綁定註釋,ScopeMatching,適當的元註釋@BindingAnnotation。因此,通過您詢問的綁定,兩個密鑰(不合格MatchingBag@ScopeMatching MatchingBag)都可以通過您的對象圖獲得,其中前者始終返回新實例,後者返回MatchingScopeAnnotation範圍內的實例(可能是新的實例,並且可能是根據您的Scope實現保存/緩存的實例)。

你的 「身份」 結合等同於可能,更可識別的bind版本:

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

...或者等價地,以及更加清晰:

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

查看更多在Guice docs on Binding Annotations