java - 使用 Guice 自动绑定(bind)所有 `Services`

标签 java c# guice

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

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

我正在处理的项目是一个不使用 Ioc 的旧项目,它是一个 Jersey 项目(具有非功能性 HK2 IOC)。

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

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

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

任何例子或方向都会非常有帮助

谢谢

最佳答案

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

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

参见:

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

关于java - 使用 Guice 自动绑定(bind)所有 `Services`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42378667/

相关文章:

c# - 强制方法不返回 null

java - 具有多个实现的 Guice 和接口(interface)

java - TableView JavaFX 中的上下文菜单可见性

java - 调用 super.paintComponent() 重要吗?

c# - 产量/迭代器极端情况

c# - 将 IAuthorizationFilter 与 Ninject 和 EF 一起使用会给出 DbContext has been disposed 错误

java - ServletModule.filter 与 @WebFilter

java - MyBatis Guice 中 MyBatis XML 多环境等价物

java - 尝试初始化 Spring 时出现 AbstractMethodError

java - 长键不等式查询