SLF4J有一个很好的机制,在运行时选择实现,取决于类路径中可用的内容。我想在几个项目中使用这样的功能,例如选择通信层或选择模拟实现。
我看了一下slf4j源码,看看它是如何完成的,我可以写一些类似的东西。在开始之前,我想知道是否存在一些轻量级 FOSS库用于此类注入。
答案 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。