运行时代码注入

时间:2011-07-19 16:40:47

标签: java dependency-injection classpath

SLF4J有一个很好的机制,在运行时选择实现,取决于类路径中可用的内容。我想在几个项目中使用这样的功能,例如选择通信层或选择模拟实现。

我看了一下slf4j源码,看看它是如何完成的,我可以写一些类似的东西。在开始之前,我想知道是否存在一些轻量级 FOSS库用于此类注入。

4 个答案:

答案 0 :(得分:2)

除非您需要Pico或Guice提供的特定配置功能,否则您可以从java.util.ServiceLoader获得所需的功能。

基本上,您所要做的就是将服务实现打包在一个JAR文件中,包含一个文本文件,其中包含“META-INF / services /”中所有实现类的列表,并随时随地。

答案 1 :(得分:1)

您是否看过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

Plus(以我非常偏见的观点)焊接岩石;)

答案 2 :(得分:0)

SLF4J的“机制”就是它的API jar使用代码编译,该代码引用仅由其“实现”jar之一提供的类。不需要任何类型的框架或库。只需编写一个模块,该模块是针对不在该模块中的类编译的。然后,您的“实现”模块在项目中包含该类时提供该类。

编辑:哦,这基本上是OSGi写得很小(非常非常小)。如果您要大规模使用这种东西,请查看OSGi容器或Eclipse Virgo。

答案 3 :(得分:-3)

每个java程序员都应该知道如何使用Spring