gpt4 book ai didi

java - 如何从 Guice Injector 获取所有单例实例?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:29:43 30 4
gpt4 key购买 nike

是否有一种简单的方法来枚举已由 Guice 注入(inject)器创建的所有单例实例?或者另一种方法来获取实现特定接口(interface)的所有单例?

我想找到所有实现 java.io.Closeable 的单例实例,以便在我的服务关闭时可以干净地关闭它们。

最佳答案

使用 Guice 的 SPI 编写这将相当容易。 Guice 的 Injector 实例公开了一个 getAllBindings()可让您遍历所有绑定(bind)的方法。

// Untested code. May need massaging.
private void closeAll(Injector injector) {
for(Map.Entry<Key<?>, Binding<?>> entry : injector.getAllBindings().entrySet()) {
final Binding<?> binding = entry.getValue();
if (Closeable.class.isAssignableFrom(
entry.getKey().getTypeLiteral().getRawType())) {
binding.accept(new DefaultBindingScopingVisitor<Void>() {
@Override public Void visitEagerSingleton() {
Closeable instance = (Closeable) (binding.getProvider().get());
try {
instance.close();
} catch (IOException e) {
// log this?
}
return null;
}
});
}
}
}

请注意,我只覆盖了 visitEagerSingleton,您可能需要修改以上内容以处理具有隐式绑定(bind)的延迟实例化的 @Singleton 实例。另请注意,如果您 bind(SomeInterface.class).to(SomeClosable.class).in(Singleton.class) 您可能需要使 SomeInterface.class 可关闭,尽管您也可以实例化每个 Singleton(通过将 Closable 检查放在范围访问者中)以确定所提供的实例本身是否是 Closable 而不管键。您还可以使用绑定(bind)键的反射来检查该类型是否可分配给 Closable。

关于java - 如何从 Guice Injector 获取所有单例实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14033146/

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