具有多个实现的Java依赖注入

时间:2014-01-14 01:30:14

标签: java dependency-injection

我的问题:如果在构建时未知实现的数量,是否有一种方法可以使用javax.inject(或任何其他Java注入框架)供Provider的使用者在运行时使用多个实现?

我需要的一些背景知识:我在可重用框架上工作,这些框架在很大程度上结合了工厂和服务定位器的使用来加载实现。其中一些似乎可以重新使用正确的依赖注入,至少在删除服务定位器的情况下,但有一些需要加载在类路径上找到的所有实现。这是通过一个简单的多实施"实现,然后加载其他实现,在集合中保存实例并在调用API时循环它们。

2 个答案:

答案 0 :(得分:2)

我假设你在Java SE平台上运行(而不是Java EE平台),在这种情况下我强烈推荐HK2(见https://hk2.java.net/2.2.0/)。它有效地实例化服务有很多支持,当然可以在运行时提供同一合同的多个实现。然后在运行时,有一整套机制可供您选择哪种特定实现满足依赖性(即服务排名或辅助注入等)

对于使用hk2的构建时间,您可以创建“居民”文件,这些文件描述了服务,它们可以在运行时满足它们,而无需对所有这些服务进行类加载(只有被挑选的服务才会被加载如果你做得好的话)。这可能会在您的应用程序启动时提高巨大的性能(如果这对您很重要)。

如果您在Java EE平台上运行,您也可以使用HK2,但您还应该仔细查看CDI。 CDI和HK2都是JSR-330的实现,因此它们都适用于javax.inject API

答案 1 :(得分:0)

所以你基本上有一个实现将API方法的调用委托给所有其他实现。你需要在Spring中通过给这个bean(这个实现实例)一个id然后使用@Autowired @Qualifier("bean_id")注入它来在所有依赖项中注入这个bean。现在列出所有可以在Spring中轻松完成的实现,方法是将applicationContext注入到委托实现中,然后查询applicationContext以获取实现API接口的所有bean。