java - 如何覆盖java中的服务提供者

标签 java stax serviceloader woodstox service-factory

这是一个更普遍的问题示例: 我正在使用 xstream 和 woodstox,woodstox 在注册 com.ctc.wstx.stax.WstxOutputFactory 的 woodstox jar 中为 javax.xml.stream.XMLOutputFactory 提供了一个服务提供者。 我想提供我自己的 javax.xml.stream.XMLOutputFactory 并且类路径中仍然有 woodstox jar。我知道我可以提供我自己的系统属性 javax.xml.stream.XMLOutputFactory ,但我正试图从我们的开发运营团队那里摆脱麻烦,并使用我的 jar 中的服务文件或可能在我的 war META 中来完成-INF/服务文件夹。查看 javax.xml.stream.FactoryFinder 的代码,如何确保我的 META-INF/services/javax.xml.stream.XMLOutputFactory 文件将是 FactoryFinder 使用的文件吗?

我们将 xstream 与 camel 一起使用,但找不到将工厂注入(inject) XStreamDataFormat 的方法

最佳答案

首先:与其依赖 JDK SPI 接口(interface),我强烈建议简化您的生活,不要使用它。与自己注入(inject) XMLInputFactory 和/或 XMLOutputFactory 相比,它确实没有增加任何值(value)。对于注入(inject),您可以使用 Guice(或 Spring);或者只是手动传递它。由于这些工厂没有自己的依赖项,所以这很容易。

但如果选择(或不得不)使用 XMLInputFactory.newInstance(),您可以为“javax.xml.stream.XMLOutputFactory”和“javax.xml.stream”定义一个系统属性。 XMLInputFactory”。

那么为什么不用JDK的方式呢?多种原因:

  1. 它增加了开销:如果您没有指定系统属性,它将不得不扫描整个类路径,对于大型应用服务器,这需要的时间是大多数解析时间的 10 倍到 100 倍
  2. 实现的优先顺序是未定义的:如果你在类路径中有多个,你会得到哪一个?谁知道...(注意:当您在类路径中添加新的 jar 时,它甚至可能会改变)
  3. 你很可能通过传递依赖获得多个impl

不幸的是,Oracle 似乎仍然坚持要添加这种已知错误的方法来注册服务提供商。为什么?可能是因为他们没有自己的 DI 库/框架(Guice 是谷歌的,Spring 是 Springsource 的),而且他们往往非常渴望控制。

关于java - 如何覆盖java中的服务提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17807123/

相关文章:

Java修改XML

java - 使用 StaX 附加 XML 元素

java - 在 Eclipse 工作区中手动重命名项目

java - Java 的测试用例实现类似于 topcoder/codechef

java - 无法使用 Stax 中的 XMLEventReader 检查 XML 中的 CDATA

Java,获取实现特定接口(interface)的 URLClassLoader 可用的所有类

java - 无法派生模块描述符 : Provider {class X} not in module

java - 当我为json添加配置时,Spring MVC应用程序中断

java - bean :message in Struts 1. 3 中的动态键