【问题标题】:Runtime code injection运行时代码注入
【发布时间】:2011-07-19 16:40:47
【问题描述】:

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

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

【问题讨论】:

    标签: java dependency-injection classpath


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      加上(在我非常有偏见的观点)焊接岩石;)

      【讨论】:

      • 显然 Weld 支持运行时注入,但不能仅根据类路径中的内容决定注入什么。我错了吗?
      • 当然,您的生产者将负责根据类路径上可用的内容生成正确的实现,您如何检查类路径取决于您。我使用 scannotation 编写了一个扫描仪并注释了我的实现类。 Scannotation 进行字节码扫描,因此即使在非常大的类路径中也非常快。但是有很多方法可以做到这一点。
      • 我明白了。问题是我正在寻找一个帮助库来查看类路径......
      【解决方案3】:

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

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

      【讨论】:

      • SLF4J 注入机制的作用远不止您的描述(例如完整性检查,后备)。请参阅LoggerFactory 代码。 OSGi 也不符合轻量级标准。
      • OSGi 也不是库。这是部署应用程序的另一种方式,但它会处理您似乎正在寻找的一切。
      【解决方案4】:

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

      【讨论】:

      • 这就是我强调轻量级的原因;-)
      • ...如果没有 AspectJ,它显然无法做到这一点:stackoverflow.com/questions/1439839/…
      • 每个Java程序员也应该知道什么时候不使用Spring。
      猜你喜欢
      • 2011-05-20
      • 2011-09-08
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 2015-05-03
      相关资源
      最近更新 更多