gpt4 book ai didi

java - 绑定(bind)到 Guice 提供程序实例时显式添加绑定(bind)器依赖项

转载 作者:行者123 更新时间:2023-12-02 03:09:20 24 4
gpt4 key购买 nike

假设我想创建一个返回集合中第一项的通用提供程序。像这样的东西:

class P extends Provider<T> {
private final Provider<Collection<T>> provider;

FirstItemProvider(Provider<Collection<T>> provider) {
this.provider = provider;
}

@Override
public T get() {
Collection<T> input = provider.get();
Iterator<T> iter = input.iterator();
return iter.hasNext() ? iter.next() : null;
}
}

现在我有各种带有不同注释的此类集合,我想向此提供程序添加绑定(bind),但是,我还希望能够使用 DefaultBindingTargetVisitor 和 getDependency() 来遍历绑定(bind)。

我尝试过类似的方法:

bind(Key.get(type, annotation))
.toProvider(new P(
getProvider(
Key.get(Types.collectionOf(type.getType()), annotation)
)
));

这在绑定(bind)方面工作得很好,但遍历不起作用,因为 Guice 没有检测到依赖关系。

我想不出任何其他方法来绑定(bind)到带注释的生产者,因为它没有注释。

有什么办法可以实现我想要做的事情吗?

谢谢亚龙

最佳答案

这对我有用:

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import javax.inject.Provider;

import com.google.inject.AbstractModule;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.name.Names;
import com.google.inject.spi.Dependency;
import com.google.inject.spi.ProviderInstanceBinding;
import com.google.inject.spi.ProviderWithDependencies;

class FirstItemProvider<T> implements ProviderWithDependencies<T> {
private final Provider<? extends Collection<? extends T>> collectionProvider;
private final Key<? extends Collection<? extends T>> key;

public FirstItemProvider(Binder binder, Key<? extends Collection<? extends T>> key) {
this.collectionProvider = binder.getProvider(key);
this.key = key;
}

@Override
public T get() {
return collectionProvider.get().iterator().next();
}

@Override
public Set<Dependency<?>> getDependencies() {
return Collections.<Dependency<?>>singleton(Dependency.get(key));
}
}

class FooModule extends AbstractModule {
@Override
protected void configure() {
Key<List<String>> listKey = new Key<List<String>>(Names.named("foo")){};
Key<String> stringKey = new Key<String>(Names.named("foo")){};

bind(listKey).toInstance(Arrays.asList("foo", "bar"));
bind(stringKey).toProvider(new FirstItemProvider<>(binder(), listKey));
}
}

public class Foo {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new FooModule());

Key<String> stringKey = new Key<String>(Names.named("foo")){};
ProviderInstanceBinding<String> binding = (ProviderInstanceBinding<String>)injector.getBinding(stringKey);
System.out.println(binding.getDependencies());
}
}

输出为

[Key[type=java.util.List<java.lang.String>, annotation=@com.google.inject.name.Named(value=foo)]]

关于java - 绑定(bind)到 Guice 提供程序实例时显式添加绑定(bind)器依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41288448/

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