使用Spring Integration XML 3.0.0.RELASE我有一个XSLT转换器,如下所示:
<int-xml:xslt-transformer id="tm100Totm120aTransformation"
xsl-resource="classpath:xsd/mailxml/xslt/tm120b_to_tm140a.xsl"
result-transformer="resultToString"
input-channel="validatedtm100Message"
output-channel="validatedtm120aMessage"/>
在不指定transformer-factory-class
属性的情况下,Spring如何确定实际使用的是哪个TransformerFactory?
TransformerFactory.newInstance()的JavaDoc声明:
获取TransformerFactory的新实例。此静态方法创建一个新的工厂实例此方法使用以下有序查找过程来确定要加载的TransformerFactory实现类:
- 使用javax.xml.transform.TransformerFactory系统属性
- 使用JRE目录中的属性文件"lib/jaxp.properties"。该配置文件采用标准java.util.Properties格式,包含实现类的完全限定名称,键是上面定义的系统属性。jaxp实现只读取jaxp.properties文件一次,然后缓存其值以备将来使用。如果第一次尝试读取文件时该文件不存在,则不会再尝试检查其是否存在。在第一次读取jaxp.properties中的任何属性后,都不可能更改该属性的值
- 如果可用,请使用Servicesneneneba API(如JAR规范中所述)来确定类名。服务API将在运行时可用的jar文件META-INF/Services/javax.xml.transform.TransformerFactory中查找类名
- 平台默认的TransformerFactory实例
一旦应用程序获得了对TransformerFactory的引用,它就可以使用该工厂来配置和获取转换器实例。
Spring是否遵循此过程?在Spring文档中,我似乎找不到Spring如何做到这一点的详细信息。
p.S.
经过调试检查,我的应用程序似乎正在使用com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
作为实现。我的理解是Xalan包含在JRE中(我使用的是Java 1.6);那么,假设我使用的是平台默认的TransformerFactory是否合理?
可以使用-Djaxp.debug=true进行运行,并通过日志确认发生了什么。
查找XSLT实现的引导过程是Xalan的一部分,它将API从多个可能的实现中分离出来。
因此,这不是Spring的一部分,而是Xalan的一部分。Spring通过调用您提到的transformer工厂方法间接使用它。
所选实现的包名称包含内部,这意味着选择了JVM附带的默认实现,这是引导过程中的最后一个选项。