当 Spring-WS 与 JAXB 一起用于编组和解组时,内部使用哪个流实现?
response = (AResponse) webSvcTemplate.marshalSendAndReceive(request);
通读 SO 查询,发现 Woodstox 比 JAXB 快。然而,当我使用 Spring-WS 时,Spring 从字面上处理了编组和解组期间发生的所有事情。
问题是如何强制 Spring-WS 使用 Woodstox 流 API?
当 Spring-WS 与 JAXB 一起用于编组和解组时,内部使用哪个流实现?
这取决于WebServiceMessageFactory
您启用了哪个。默认情况下,Spring-WS 使用SaajSoapMessageFactory
基于 DOM 的 SAAJ(即 ),并且根本不做任何流式传输,因为整个 XML 结构都存储在内存中。您可以从 SAAJ 切换到 Axiom(即AxiomSoapMessageFactory
),它确实执行基于 StAX 的流式传输。请参阅参考文档。
通读 SO 查询,发现 Woodstox 比 JAXB 快。
这实际上取决于上下文:消息的大小、正在运行的硬件等。根据个人经验,我发现对于“小型”到“中型”大小的 SOAP 消息,流式传输并没有明显更快。
此外,您在这里将苹果与橙子进行比较:Woodstox 是一个 StAX 实现,一个 XML 解析器。JAXB 是一个编组库,它使用 StAX(以及 SAX 和 DOM)等解析器从 XML 构建 Java 对象。
然而,当我使用 Spring-WS 时,Spring 从字面上处理了编组和解组期间发生的所有事情。
不是很棒吗?;)
问题是如何强制 Spring-WS 使用 Woodstox 流 API?
只需将 Woodstox 放在类路径上就足够了,Spring-WS 会自动拾取它。不过,您必须先切换到 Axiom(见上文),然后才能注意到任何差异。即便如此,我敢打赌,性能差异并没有那么大。