【问题标题】:Auto Bind all `Services` using Guice使用 Guice 自动绑定所有“服务”
【发布时间】:2017-07-11 17:53:30
【问题描述】:

在 .Net 编码 7 年后,我最近开始使用 Java,不要误会我的意思,我喜欢 C#,但工作需要,我需要改变。

我的问题是关于 Ioc 注册,在 C# 中我使用过 Windsor 和 SimpleInjector(我非常喜欢),而在 java 中我想开始使用 Guice。

我正在从事的项目是一个不使用 Ioc 的遗留项目,也就是说,它是一个 Jersey 项目(具有非功能性 HK2 IOC)。

现在我的问题是,在 C# 上,我已经使用反射在运行时注册了应用程序启动时的所有接口和具体实现。

我已经阅读了 Guice 文档,但找不到任何示例,而且 JIT 绑定不是很了解。

那么有可能吗?这是最佳做法吗? (我不认为手动编写所有绑定是正确的做法)

任何示例或指导都会非常有帮助

谢谢

【问题讨论】:

  • 没有功能的Hk2是什么意思。 Hk2 非常实用...... Hk2 还有一个强大的框架,用于使用@Service 和 ServiceLocator 填充器自动注册服务
  • @jwells131313,我的意思是我们系统中的HK2无法运行。

标签: java c# guice


【解决方案1】:

这在 Java 和 Guice 中比在其他平台上更难做到:Java 类加载器是为 finding classes by their package/name with fallbacks 设计的,而不是枚举类路径上的每个类或实现。尽管存在一些库解决方案可以在规定的条件下执行后者(例如 Reflections 或 Google Guava),但通常不可能遍历当前 ClassLoader 及其父级可用的每个类,因为该集合理论上通过 URLClassLoader 是无限的和类似的基于网络的类加载器。

这使得显式列出要公开给应用程序的接口和实现变得很常见并且经常需要,无论您是否使用 Guice。

见:

因此,很难完成诸如“启动每个实现 MyStartableService 的可访问类”之类的任务,尽管通过Guice SPI,您可能会更幸运地“在返回之前启动通过 Guice 请求的每个 MyStartableService”。或者,您也可以使用 Java 6 中内置的 Java 的 SPI framework(例如 ServiceLoader)来允许适当服务的分片或分布式列表,然后可以通过调用模块中的 bind 将其提供给 Guice。 (Olivier 恰当地建议在 cmets 中使用 AutoService,这样可以轻松生成为 ServiceLoader 提供支持的元数据文件。)

【讨论】:

  • 如果您采用 SPI 框架方式,请尝试使用 Google 的 AutoService:这是一个救命稻草:您不要触摸任何非 java 文件,只需添加一个小注释,一切就可以了自动为您完成。
  • 谢谢你的详细回答,我会试着了解下一步该怎么做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-10
  • 2013-12-27
  • 2010-11-28
相关资源
最近更新 更多