在 Spring、Guice、Weld 或其他 DI 实现之间切换

Switching among Spring, Guice, Weld or other DI implementations

我正在其上编写一个框架,供其他团队开发应用程序。

我想提供 依赖注入 作为其中的一部分。我正在让开发人员使用 JSR 330 注释并且我的框架可以在 DI 上工作。

还有以下问题

如果我使用 Guice,开发者需要编写 modulebeans.xml如果我使用 WELD。这将特定的 DI 与我的开发人员应用程序代码结合在一起。我想在不触及任何应用程序代码的情况下切换框架中的底层依赖注入。

有办法吗?

如果您严格遵守 JSR330 功能,则可以提供一个框架 jar,供您提到的所有三个实现 DI 框架使用。 要允许 CDI 扫描模块,您应该提供一个 bean.xml,但我不认为该代码具有侵入性。

如果您需要提供的不仅仅是 JSR330,例如模块、工厂、生产者方法、AutoConfigurations,...您可以提供自定义扩展模块,这样您就可以 "myframework-core" 实现不可知的东西"myframework-guice" 在其之上为 guice 等提供助手和模块。

我认为 JSR-330 没有足够的关于系统如何启动的信息以使其真正可切换。例如,如果您使用的是 Guice,则需要创建一个 Injector。如果您使用 Spring,则需要使用它的 JavaConfig。如果您使用的是 HK2,则需要使用居民生成器或使用模块。如果您使用 CDI,您只需要 beans.xml(在后来的 CDI 中您甚至不需要它),但您几乎肯定会发现您需要 CDI 的其他功能,例如 Producers。

出于这些原因,我认为 JSR-330 太小而不便于携带