这是一个更普遍的问题示例: 我正在使用 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的方式呢?多种原因:
- 它增加了开销:如果您没有指定系统属性,它将不得不扫描整个类路径,对于大型应用服务器,这需要的时间是大多数解析时间的 10 倍到 100 倍
- 实现的优先顺序是未定义的:如果你在类路径中有多个,你会得到哪一个?谁知道...(注意:当您在类路径中添加新的 jar 时,它甚至可能会改变)
- 你很可能通过传递依赖获得多个impl
不幸的是,Oracle 似乎仍然坚持要添加这种已知错误的方法来注册服务提供商。为什么?可能是因为他们没有自己的 DI 库/框架(Guice 是谷歌的,Spring 是 Springsource 的),而且他们往往非常渴望控制。
关于java - 如何覆盖java中的服务提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17807123/