DI 或服务定位器:在 运行 时间(无静态绑定)在 scala 中注入实现

DI or Service Locator : Injecting implementations at run-time ( no static binding ) in scala

我有一个用例,我想提供一个简单的 API 来扩展我的 Scala 应用程序的功能。

我过去几天一直在努力寻找一个 java/scala DI 框架或库来为我做以下事情:

  1. 识别类路径
  2. 上interface/trait的实现
  3. 在标记的站点上实例化并注入所述实现(重要特征:所有这些),最好带有注释
  4. 上述情况不会在编译器中发生,因为我需要一个插件架构,在 JVM 启动之前不会引入插件
  5. 因此上述内容可以在 JVM 启动时发生(不需要热插拔)

我越来越倾向于 OSGi DS,我是它的忠实粉丝,但由于 #4,我认为它是一种矫枉过正。

我查看了 guice、weld、scaladi 和 macwire,但无法立即找到执行此操作的简单方法。我的 objective 是为了 "plugin" 作者不必以任何方式知道我的 injection/IoC 解决方案,除了偶尔的注释(最好是 JSR330 )在注入站点我愿意处理更丑陋的事情。 :-)

我是否必须在这里推出自己的解决方案,使用 OSGi,或者我是否遗漏了上述库中的一些微不足道的东西?

ps:我试图避开 OSGi 主要是因为它与我正在使用的应用程序框架交互(akka - 不确定 bundle/DS 生命周期与单个演员系统)

我看看 Scaldi 目前提供了哪些功能。我发现它已经足够成熟了。所以使用这个 DI 库来实现你的目标并不难。例如,您只能在某些配置文件或其他任何内容中实现专门搜索 annotated/specified 的代码。

如果您喜欢 DS(而且它似乎非常适合您的问题)那么为什么不用 Akka 解决任何问题呢?我很确定其他人会愿意提供帮助,因为它看起来是一个有趣的组合。

如果您负担得起,最好(不仅对您,而且对整个生态系统)采纳 Peter 的建议。

不过,从实用的角度来说,Java 有 SPI,这是 OOTB 并且可能是在您的特定情况下最简单的方法。