我想了解以下提供商:
@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 :(得分:3)
对于Guice,@ScopeMatching MatchingBag
与完全不同的MatchingBag
密钥完全不同。剥离,你可以认为它类似于@Provides A provideA(AImpl impl) { return impl; }
。
Guice的行为类似于Map<Key, Provider>
,其中Key是具有可选绑定注释的限定类型。您在此处使用自定义绑定注释ScopeMatching
,并使用相应的元注释@BindingAnnotation
。因此,通过您要问的绑定,两个键(不合格MatchingBag
和@ScopeMatching MatchingBag
)都可以通过对象图获得,前者总是返回一个新实例,后者返回一个实例在MatchingScopeAnnotation
范围内(可能是一个新实例,根据您的Scope实现可能是保存/缓存的实例)。
你的身份&#34;绑定等同于可能更容易识别的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);
中的详情