gpt4 book ai didi

java - 作为身份函数实现的 Guice-Provider 如何工作?

转载 作者:行者123 更新时间:2023-11-30 08:01:13 25 4
gpt4 key购买 nike

我正在尝试理解以下提供者:

@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
}

定义一个只是身份函数的提供者看起来很奇怪。我可以看到删除提供程序会导致注入(inject)错误,所以这很重要。

你能帮我理解提供者的作用是什么吗?解决供应商不是先有鸡还是先有蛋的问题吗? Guice 是如何做到的?

最佳答案

致 Guice,一个 @ScopeMatching MatchingBag是与不合格的 MatchingBag 完全不同的 key .剥离后,您可以将其视为类似于 @Provides A provideA(AImpl impl) { return impl; } .

Guice 就像一个 Map<Key, Provider>其中 Key 是具有可选绑定(bind)注释的限定类型。您在这里有一个自定义绑定(bind)注释,ScopeMatching , 带有适当的元注释 @BindingAnnotation .因此,通过您询问的绑定(bind),两个键(不合格的 MatchingBag@ScopeMatching MatchingBag )都可以通过您的对象图获得,其中前者总是返回一个新实例,而后者返回 MatchingScopeAnnotation 中的一个实例。 scope(根据您的 Scope 实现,它可能是一个新实例,也可能是一个已保存/缓存的实例)。

您的“身份”绑定(bind)相当于可能更易识别的 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 中查看更多信息.

关于java - 作为身份函数实现的 Guice-Provider 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37945137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com