【发布时间】:2011-07-19 16:40:47
【问题描述】:
SLF4J 有一个很好的机制,在运行时选择实现,取决于类路径中可用的内容。我想在几个项目中使用这样的功能,例如选择通信层或选择模拟实现。
我查看了 slf4j 源代码,看看它是如何完成的,我可以写一些类似的东西。在开始之前,我想知道是否存在一些用于这种注入的轻量级 FOSS 库。
【问题讨论】:
标签: java dependency-injection classpath
SLF4J 有一个很好的机制,在运行时选择实现,取决于类路径中可用的内容。我想在几个项目中使用这样的功能,例如选择通信层或选择模拟实现。
我查看了 slf4j 源代码,看看它是如何完成的,我可以写一些类似的东西。在开始之前,我想知道是否存在一些用于这种注入的轻量级 FOSS 库。
【问题讨论】:
标签: java dependency-injection classpath
除非您需要 Pico 或 Guice 提供的特定配置能力,否则您可以从 java.util.ServiceLoader 获得所需的功能。
基本上,您所要做的就是将您的服务实现打包到一个 JAR 文件中,然后在“META-INF/services/”中包含一个包含所有实现类列表的文本文件。
【讨论】:
您看过 Weld,CDI 是 EE6 规范的一部分,但 Weld 实现也支持在 Java SE 环境中运行。它完全符合您的要求,这里是相关文档的链接:
http://seamframework.org/Weld SE 应用程序的一个 maven 依赖项。
http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/environments.html#d0e5333 在 SE 中引导 Weld 容器。
在运行时改变实现的生产者方法:
http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/producermethods.html
加上(在我非常有偏见的观点)焊接岩石;)
【讨论】:
SLF4J 的“机制”只是它的 API jar 是用引用仅由其“实现”jar 之一提供的类的代码编译的。为此,不需要任何框架或库。只需编写一个针对不在该模块中的类编译的模块。然后,您的“实现”模块在包含在项目中时会提供该类。
编辑:哦,这基本上是 OSGi 写得很小(非常非常小)。如果您打算大规模使用这种东西,请查看 OSGi 容器或 Eclipse Virgo。
【讨论】:
LoggerFactory 代码。 OSGi 也不符合轻量级标准。
每个java程序员都应该知道如何使用Spring。
【讨论】: