Java 运行时代码注入

Java 运行时代码注入,java,dependency-injection,classpath,Java,Dependency Injection,Classpath,SLF4J有一个很好的机制,根据类路径中的可用内容,在运行时选择实现。我希望在几个项目中使用这种特性,例如选择通信层或选择模拟实现 我看了一下slf4j源代码,看看它是如何完成的,我可以写一些类似的东西。在开始之前,我想知道是否存在用于这种注入的轻量级FOSS库。每个java程序员都应该知道如何使用。除非您需要Pico或Guice提供的特定配置功能,否则您可以从java.util.ServiceLoader获得所需的功能 基本上,您所要做的就是将服务实现打包到一个JAR文件中,在“META-IN

SLF4J有一个很好的机制,根据类路径中的可用内容,在运行时选择实现。我希望在几个项目中使用这种特性,例如选择通信层或选择模拟实现


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

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

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

基本上,您所要做的就是将服务实现打包到一个JAR文件中,在“META-INF/services/”中包含一个包含所有实现类列表的文本文件,然后就可以开始了。

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


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

您看过Weld吗,CDI是EE6规范的一部分,但Weld实现也支持在Java SE环境中运行。它正是您想要的,下面是相关文档的链接:

您的SE应用程序有一个maven依赖项。
在SE中引导焊接容器

用于在运行时改变实现的生产者方法:


加上(在我看来是非常偏颇的)焊接岩石;)

这就是我强调轻量级的原因;-)。。。显然,没有AspectJ它无法做到这一点:每个Java程序员都应该知道什么时候不使用Spring。SLF4J注入机制的作用远不止您的描述(例如,健全性检查、回退)。请参阅日志工厂code。OSGi也不是轻量级的。OSGi也不是一个库。这是部署应用程序的另一种方式,但它会处理您似乎要查找的所有内容。显然,Weld支持runtim注入,但无法决定仅在类路径中存在的内容上注入什么。我错了吗?可以肯定的是,您的制作者将负责根据类路径上可用的内容生成正确的实现,如何检查类路径取决于您。我使用scannotation编写了一个扫描器,并注释了我的实现类。Scannotation进行字节码扫描,因此即使在非常大的类路径中,它的速度也非常快。但是有很多方法可以做到这一点,我明白了。问题是我正在寻找一个助手库来查看类路径。。。