加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 08:49:01 所属栏目:Java 来源:网络整理
导读:有没有一种简单的方法来枚举Guice Injector已经创建的所有单例实例?或者另外一种方法来获得实现特定接口的所有单例? 我想找到所有实现java.io.Closeable的单例实例,这样当我的服务关闭时我可以干净地关闭它们. 解决方法 使用Guice的SPI编写起来相当容易. G
有没有一种简单的方法来枚举Guice Injector已经创建的所有单例实例?或者另外一种方法来获得实现特定接口的所有单例?

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

解决方法

使用Guice的SPI编写起来相当容易. Guice的Injector实例公开了一个 getAllBindings()方法,允许您遍历所有绑定.

// Untested code. May need massaging.
private void closeAll(Injector injector) {
  for(Map.Entry<Key<?>,Binding<?>> entry : injector.getAllBindings()) {
    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实例.另请注意,如果绑定(SomeInterface.class).to(SomeClosable.class).in(Singleton.class),您可能需要使SomeInterface.class Closable,尽管您也可以实例化每个Singleton(通过将Closable检查放入其中)范围访问者)确定所提供的实例本身是否是Closable而不管密钥是什么.您也可以在Binding的Key上使用Reflection来检查该类型是否可分配给Closable.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读