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

问题描述 投票:3回答:1

有没有一种简单的方法来枚举Guice Injector已经创建的所有单例实例?或者另外一种方法来获得实现特定接口的所有单例?

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

java dependency-injection guice
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.