作为身份功能实现的Guice-Provider如何工作?

时间:2016-06-21 12:58:26

标签: java guice

我想了解以下提供商:

@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是如何做到的?

1 个答案:

答案 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);

请参阅Guice docs on Binding Annotations

中的详情