是否有一种简单的方法来枚举Guice Injector已经创建的所有单例实例?或者换一种方法来获得实现特定接口的所有单例?
我想找到所有实现java.io.Closeable的单例实例,这样我可以在服务关闭时干净地关闭它们。
答案 0 :(得分:7)
使用Guice的SPI编写相当容易。 Guice的Injector实例公开了一个getAllBindings()方法,允许您遍历所有绑定。
// 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
并且您可能必须修改上述内容以处理具有隐式绑定的延迟实例化@Singleton
实例。另请注意,如果您bind(SomeInterface.class).to(SomeClosable.class).in(Singleton.class)
,您可能需要使SomeInterface.class
Closable,尽管您也可以实例化每个Singleton(通过将Closable检查放在范围访问者中)来确定提供的实例本身是否Closable无论关键。您也可以在Binding的Key上使用Reflection来检查该类型是否可以分配给Closable。