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

使用Guice的SPI编写起来相当容易. Guice的Injector实例公开了一个

getAllBindings()方法,允许您遍历所有绑定.

// Untested code. May need massaging.

private void closeAll(Injector injector) {

for(Map.Entry, Binding>> entry : injector.getAllBindings()) {

final Binding> binding = entry.getValue();

if (Closeable.class.isAssignablefrom(

entry.getKey().getTypeLiteral().getRawType())) {

binding.accept(new DefaultBindingScopingVisitor() {

@Override public Void visitEagerSingleton() {

Closeable instance = (Closeable) (binding.getProvider().get());

try {

instance.close();

} catch (IOException e) {

// log this?

}

return null;

}

});

}

}

}

请注意,我只覆盖visitEagerSingleton并且您可能必须修改上述内容以使用隐式绑定来处理延迟实例化的@Singleton实例.另请注意,如果绑定(SomeInterface.class).to(SomeClosable.class).in(Singleton.class),您可能需要使SomeInterface.class Closable,尽管您也可以实例化每个Singleton(通过将Closable检查放入其中)范围访问者)确定所提供的实例本身是否是Closable而不管密钥是什么.您也可以在Binding的Key上使用Reflection来检查该类型是否可分配给Closable.


版权声明:本文为weixin_39520204原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。