在 .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 设计的。比枚举类路径上的每个类或实现更重要。尽管存在一些库解决方案可以在规定的条件下执行后者(例如 Reflections 或 Google Guava ),但通常不可能遍历当前 ClassLoader 及其父级可用的每个类,因为该集合理论上通过 URLClassLoader 是无限的。和类似的基于网络的类加载器。
无论您是否使用 Guice,这使得显式列出您的接口(interface)和实现以公开给您的应用程序变得很常见并且通常是必要的。
参见:
- Can you find all classes in a package using reflection?
- Java : loop on all the classes in the classpath
因此,尽管通过 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/